home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-1 / Inter.Net 55-1.iso / CBuilder / Setup / BCB / data.z / sysdefs.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-09  |  101.2 KB  |  2,950 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // SYSDEFS.H - Support for properties & vcl intrinsic types
  3. // $Revision:   1.28.2.2  $
  4. // Copyright (c) 1997, 1998 Borland International
  5. /////////////////////////////////////////////////////////////////////////////
  6. #ifndef SYSDEFS_H
  7. #define SYSDEFS_H
  8.  
  9. #pragma comment(lib, "vcle35.lib")
  10.  
  11. #if __BORLANDC__ < 0x500
  12. #error BCW 5.0 or greater required
  13. #endif
  14.  
  15. #pragma anon_struct on      // support anonymous structs (within unions)
  16.  
  17. #include <windows.h>
  18.  
  19. #if !defined(_BASETYPS_H_)
  20. #include <basetyps.h>
  21. #endif
  22.  
  23. // Bring in Interface definitions - Supply what may be missing in LEAN_AND_MEAN mode
  24. //
  25. #if !defined(BEGIN_INTERFACE)       // If OBJBASE.H has not been seen yet!
  26. #define BEGIN_INTERFACE
  27. #endif
  28. #if !defined(END_INTERFACE)         // If OBJBASE.H has not been seen yet!
  29. #define END_INTERFACE
  30. #endif
  31. #if !defined(WINOLEAPI)             // If OBJBASE.H has not been seen yet!
  32. #define WINOLEAPI        EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
  33. #endif
  34. #if !defined(HUGEP)                 // If OBJBASE.H has not been seen yet! 
  35. #define HUGEP
  36. #endif
  37.  
  38. // The following bring in basic windows types + IUnknown
  39. //
  40. #include <wtypes.h>
  41. #include <unknwn.h>
  42.  
  43. // The following are Automation related structures required by either Variant
  44. // or some other VCL Header. We forward ref. the tagStruct and #define the
  45. // typedef name to the tagStruct.
  46. //
  47. interface IDispatch;
  48. union     tagCY;
  49. struct    tagSAFEARRAY;
  50. struct    tagVARIANT;
  51. struct    tagSTATSTG;
  52. #define   CURRENCY  tagCY
  53. #define   SAFEARRAY tagSAFEARRAY
  54. #define   VARIANT   tagVARIANT
  55.  
  56. // The following macros must appear before AnsiString and WideString are defined
  57. //
  58. #define PACKAGE                 __declspec(package)
  59. #define THREAD                  __declspec(thread)
  60. #define PASCALIMPLEMENTATION    __declspec(pascalimplementation, package)
  61. #define DELPHIRETURN            __declspec(delphireturn, package)
  62. #define DELPHICLASS             __declspec(delphiclass, package)
  63.  
  64. #if !defined(DYNAMIC)
  65. #define DYNAMIC __declspec(dynamic)
  66. #endif
  67.  
  68. #if !defined(MESSAGE)
  69. #define MESSAGE
  70. #endif
  71.  
  72. #if !defined(HIDESBASEDYNAMIC)
  73. #define HIDESBASEDYNAMIC __declspec(hidesbase, dynamic)
  74. #endif
  75.  
  76. #if !defined(HIDESBASE)
  77. #define HIDESBASE __declspec(hidesbase)
  78. #endif
  79.  
  80. // VCL_IOSTREAM: This macro enables the i/ostream insertion/extraction operators of VCL
  81. //               classes. The operators are otherwise hidden to cut down on the amount
  82. //               of lines (i.e. symbols) that must be compiled. (The redefinition of
  83. //               i/ostream as templates in the Standard Library made these headers
  84. //               fairly significant).
  85. //
  86. // If <iostream.h> has already been included, then expose the VCL insertion/extraction operators.
  87. //
  88. #if defined(__STD_IOSTREAM__)
  89. #define VCL_IOSTREAM
  90. #elif defined(VCL_IOSTREAM) && !defined(__STD_IOSTREAM__)
  91. #include <iostream.h>
  92. #endif
  93. #if !defined(DSTRING_H)
  94. #include <dstring.h>
  95. #endif
  96. #if !defined(WSTRING_H)
  97. #include <wstring.h>
  98. #endif
  99.  
  100.  
  101. //---------------------------------------------------------------------------
  102. // For this header, turn off "function not expanded inline" and
  103. //                           "temp used for param" warnings
  104. #pragma option push -w-inl -w-lvc
  105.  
  106. extern "C" __int64 _roundToInt64(long double);
  107.  
  108. #define __safecall __stdcall
  109. #define __interface class
  110. #define __dispinterface class
  111.  
  112.  
  113. //forward declarations
  114.  
  115. namespace System
  116. {
  117.  
  118.   class DELPHIRETURN OleVariant;
  119.   class DELPHIRETURN Variant;
  120.  
  121.   template <class T> class DELPHIRETURN DelphiInterface;
  122.  
  123.   class PACKAGE TMetaClass;
  124.   typedef TMetaClass* TClass;
  125.  
  126.   class DELPHIRETURN CurrencyBase
  127.   {
  128.   public:
  129.     __int64 Val;
  130.   };
  131.  
  132.   class DELPHIRETURN Currency : public CurrencyBase
  133.   {
  134.     friend Currency __fastcall operator +(int lhs, const Currency& rhs);
  135.     friend Currency __fastcall operator -(int lhs, const Currency& rhs);
  136.     friend Currency __fastcall operator *(int lhs, const Currency& rhs);
  137.     friend Currency __fastcall operator /(int lhs, const Currency& rhs);
  138.     friend Currency __fastcall operator +(double lhs, const Currency& rhs);
  139.     friend Currency __fastcall operator -(double lhs, const Currency& rhs);
  140.     friend Currency __fastcall operator *(double lhs, const Currency& rhs);
  141.     friend Currency __fastcall operator /(double lhs, const Currency& rhs);
  142.   public:
  143.     __fastcall Currency()                        {Val = 0;}
  144.     __fastcall Currency(double val)              {Val = _roundToInt64(10000 * val);}
  145.     __fastcall Currency(int val)                 {Val = 10000*(__int64)val;}
  146.     __fastcall Currency(const CurrencyBase& src) {Val = src.Val;}
  147.     __fastcall Currency(const Currency& src)     {Val = src.Val;}
  148.     __fastcall Currency(const AnsiString& src);
  149.  
  150.     Currency& __fastcall operator =(double rhs)
  151.     {
  152.       Val = _roundToInt64(10000 * rhs);
  153.       return *this;
  154.     }
  155.     Currency& __fastcall operator =(int rhs)
  156.     {Val = 10000*(__int64)rhs; return *this;}
  157.     Currency& __fastcall operator =(const CurrencyBase& rhs)
  158.     {Val=rhs.Val;return *this;}
  159.     Currency& __fastcall operator =(const Currency& rhs)
  160.     {Val = rhs.Val; return *this;}
  161.  
  162.     Currency& __fastcall operator +=(const Currency& rhs)
  163.     {Val += rhs.Val; return *this;}
  164.     Currency& __fastcall operator -=(const Currency& rhs)
  165.     {Val -= rhs.Val; return *this;}
  166.     Currency& __fastcall operator *=(const Currency& rhs)
  167.     {Val *= rhs.Val; Val /= 10000; return *this;}
  168.     Currency& __fastcall operator /=(const Currency& rhs)
  169.     {Val *= 10000; Val /= rhs.Val; return *this;}
  170.     Currency& __fastcall operator %=(int rhs)
  171.     {Val %= 10000 * (__int64)rhs; return *this;}
  172.  
  173.     Currency& operator ++() {Val += 10000; return *this;}
  174.     Currency operator ++(int) {Currency tmp(*this); Val += 10000; return tmp;}
  175.     Currency& operator --() {Val -= 10000; return *this;}
  176.     Currency operator --(int) {Currency tmp(*this); Val -= 10000; return tmp;}
  177.  
  178.     Currency __fastcall operator +(const Currency& rhs) const
  179.     {Currency tmp(*this); return tmp += rhs;}
  180.     Currency __fastcall operator -(const Currency& rhs) const
  181.     {Currency tmp(*this); return tmp -= rhs;}
  182.     Currency __fastcall operator *(const Currency& rhs) const
  183.     {Currency tmp(*this); return tmp *= rhs;}
  184.     Currency __fastcall operator /(const Currency& rhs) const
  185.     {Currency tmp(*this); return tmp /= rhs;}
  186.  
  187.     Currency __fastcall operator +(int rhs) const
  188.     {Currency tmp(*this); return tmp += Currency(rhs);}
  189.     Currency __fastcall operator -(int rhs) const
  190.     {Currency tmp(*this); return tmp -= Currency(rhs);}
  191.     Currency __fastcall operator *(int rhs) const
  192.     {Currency tmp(*this); return tmp *= Currency(rhs);}
  193.     Currency __fastcall operator /(int rhs) const
  194.     {Currency tmp(*this); return tmp /= Currency(rhs);}
  195.     Currency __fastcall operator %(int rhs) const
  196.     {return Currency(static_cast<int>(Val % (10000 * (__int64)rhs))) / 10000;}
  197.  
  198.     Currency __fastcall operator +(double rhs) const
  199.     {Currency tmp(*this); return tmp += Currency(rhs);}
  200.     Currency __fastcall operator -(double rhs) const
  201.     {Currency tmp(*this); return tmp -= Currency(rhs);}
  202.     Currency __fastcall operator *(double rhs) const
  203.     {Currency tmp(*this); return tmp *= Currency(rhs);}
  204.     Currency __fastcall operator /(double rhs) const
  205.     {Currency tmp(*this); return tmp /= Currency(rhs);}
  206.  
  207.     Currency __fastcall operator -() const
  208.     {Currency tmp(*this); tmp.Val = -(tmp.Val); return tmp;}
  209.  
  210.     Currency __fastcall operator !() const
  211.     {Currency tmp(*this); tmp.Val = !(tmp.Val); return tmp;}
  212.  
  213.     // comparisons (Currency rhs)
  214.     bool __fastcall operator ==(const Currency& rhs) const
  215.     {return Val == rhs.Val;}
  216.     bool __fastcall operator !=(const Currency& rhs) const
  217.     {return Val != rhs.Val;}
  218.     bool __fastcall operator >(const Currency& rhs) const
  219.     {return Val > rhs.Val;}
  220.     bool __fastcall operator <(const Currency& rhs) const
  221.     {return Val < rhs.Val;}
  222.     bool __fastcall operator >=(const Currency& rhs) const
  223.     {return Val >= rhs.Val;}
  224.     bool __fastcall operator <=(const Currency& rhs) const
  225.     {return Val <= rhs.Val;}
  226.  
  227.     // comparisons (int rhs)
  228.     bool __fastcall operator ==(int rhs) const
  229.     {return Val == 10000 * (__int64)rhs;}
  230.     bool __fastcall operator !=(int rhs) const
  231.     {return Val != 10000 * (__int64)rhs;}
  232.     bool __fastcall operator >(int rhs) const
  233.     {return Val > 10000 * (__int64)rhs;}
  234.     bool __fastcall operator <(int rhs) const
  235.     {return Val < 10000 * (__int64)rhs;}
  236.     bool __fastcall operator >=(int rhs) const
  237.     {return Val >= 10000 * (__int64)rhs;}
  238.     bool __fastcall operator <=(int rhs) const
  239.     {return Val <= 10000 * (__int64)rhs;}
  240.  
  241.     // comparisons (double rhs)
  242.     bool __fastcall operator ==(double rhs) const
  243.     {return Val == _roundToInt64(10000 * (long double)rhs);}
  244.     bool __fastcall operator !=(double rhs) const
  245.     {return Val != _roundToInt64(10000 * (long double)rhs);}
  246.     bool __fastcall operator >(double rhs) const
  247.     {return Val > _roundToInt64(10000 * (long double)rhs);}
  248.     bool __fastcall operator <(double rhs) const
  249.     {return Val < _roundToInt64(10000 * (long double)rhs);}
  250.     bool __fastcall operator >=(double rhs) const
  251.     {return Val >= _roundToInt64(10000 * (long double)rhs);}
  252.     bool __fastcall operator <=(double rhs) const
  253.     {return Val <= _roundToInt64(10000 * (long double)rhs);}
  254.  
  255.     __fastcall operator double() const {return ((double)Val) / 10000;}
  256.     __fastcall operator int() const    {return (int) (Val / 10000);}
  257.     __fastcall operator AnsiString() const;
  258.   };
  259.  
  260. // Currency friends
  261. //
  262.   inline Currency __fastcall operator +(int lhs, const Currency& rhs)
  263.   {Currency tmp(lhs); return tmp += rhs;}
  264.   inline Currency __fastcall operator -(int lhs, const Currency& rhs)
  265.   {Currency tmp(lhs); return tmp -= rhs;}
  266.   inline Currency __fastcall operator *(int lhs, const Currency& rhs)
  267.   {Currency tmp(lhs); return tmp *= rhs;}
  268.   inline Currency __fastcall operator /(int lhs, const Currency& rhs)
  269.   {Currency tmp(lhs); return tmp /= rhs;}
  270.   inline Currency __fastcall operator +(double lhs, const Currency& rhs)
  271.   {Currency tmp(lhs); return tmp += rhs;}
  272.   inline Currency __fastcall operator -(double lhs, const Currency& rhs)
  273.   {Currency tmp(lhs); return tmp -= rhs;}
  274.   inline Currency __fastcall operator *(double lhs, const Currency& rhs)
  275.   {Currency tmp(lhs); return tmp *= rhs;}
  276.   inline Currency __fastcall operator /(double lhs, const Currency& rhs)
  277.   {Currency tmp(lhs); return tmp /= rhs;}
  278.  
  279. // NOTE: Insertion/Extraction operators of VCL classes are only visible
  280. //       if VCL_IOSTREAM is defined.
  281. //
  282. #if defined(VCL_IOSTREAM)
  283.   ostream& operator << (ostream& os, const Currency& arg);
  284.   istream& operator >> (istream& is, Currency& arg);
  285. #endif
  286.  
  287.   class DELPHIRETURN TDateTimeBase
  288.   {
  289.   public:
  290.     double Val;
  291.   };
  292.  
  293.   class DELPHIRETURN TDateTime : public TDateTimeBase
  294.   {
  295.   public:
  296.     // Used by TDateTime(const AnsiString& src)
  297.     enum TDateTimeFlag {Date, Time, DateTime};
  298.  
  299.     static TDateTime __fastcall CurrentDate();
  300.     static TDateTime __fastcall CurrentTime();
  301.     static TDateTime __fastcall CurrentDateTime();
  302.     static TDateTime __fastcall FileDateToDateTime(int fileDate);
  303.  
  304.     __fastcall TDateTime()                                  {Val = 0;}
  305.     __fastcall TDateTime(const TDateTimeBase& src)          {Val = src.Val;}
  306.     __fastcall TDateTime(const TDateTime& src)              {Val = src.Val;}
  307.     __fastcall TDateTime(const double src)                  {Val = src;}
  308.     __fastcall TDateTime(const int src)                     {Val = src;}
  309.     __fastcall TDateTime(const AnsiString& src, TDateTimeFlag flag = DateTime);
  310.     __fastcall TDateTime(unsigned short year, unsigned short month,
  311.                     unsigned short day);
  312.     __fastcall TDateTime(unsigned short hour, unsigned short min,
  313.                     unsigned short sec, unsigned short msec);
  314.  
  315.     TDateTime& __fastcall operator =(const TDateTimeBase& rhs)
  316.     {Val = rhs.Val;return *this;}
  317.     TDateTime& __fastcall operator =(const TDateTime& rhs)
  318.     {Val = rhs.Val;  return *this;}
  319.     TDateTime& __fastcall operator =(const double rhs)
  320.     {Val = rhs; return *this;}
  321.     TDateTime& __fastcall operator =(const int rhs)
  322.     {Val = rhs; return *this;}
  323.  
  324.     TDateTime& __fastcall operator +=(const TDateTimeBase& rhs)
  325.     {Val+=rhs.Val;return *this;}
  326.     TDateTime& __fastcall operator +=(const TDateTime& rhs)
  327.     {Val += rhs.Val; return *this;}
  328.     TDateTime& __fastcall operator +=(const double rhs)
  329.     {Val += rhs; return *this;}
  330.     TDateTime& __fastcall operator +=(const int rhs)
  331.     {Val += rhs; return *this;}
  332.  
  333.     TDateTime& __fastcall operator -=(const TDateTimeBase& rhs)
  334.     {Val-=rhs.Val;return *this;}
  335.     TDateTime& __fastcall operator -=(const TDateTime& rhs)
  336.     {Val -= rhs.Val; return *this;}
  337.     TDateTime& __fastcall operator -=(const double rhs)
  338.     {Val -= rhs; return *this;}
  339.     TDateTime& __fastcall operator -=(const int rhs)
  340.     {Val -= rhs; return *this;}
  341.  
  342.     TDateTime& operator ++() {Val++; return *this;}
  343.     TDateTime operator ++(int) {TDateTime tmp(*this); Val++; return tmp;}
  344.     TDateTime& operator --() {Val--; return *this;}
  345.     TDateTime operator --(int) {TDateTime tmp(*this); Val--; return tmp;}
  346.  
  347.     TDateTime __fastcall operator +(const TDateTimeBase& rhs) const
  348.     {return Val+rhs.Val;}
  349.     TDateTime __fastcall operator +(const TDateTime& rhs) const
  350.     {return Val+rhs.Val;}
  351.     TDateTime __fastcall operator +(const double rhs) const {return Val+rhs;}
  352.     TDateTime __fastcall operator +(const int rhs) const {return Val+rhs;}
  353.  
  354.     TDateTime __fastcall operator -(const TDateTimeBase& rhs) const
  355.     {return Val-rhs.Val;}
  356.     TDateTime __fastcall operator -(const TDateTime& rhs) const
  357.     {return Val-rhs.Val;}
  358.     TDateTime __fastcall operator -(const double rhs) const {return Val-rhs;}
  359.     TDateTime __fastcall operator -(const int rhs) const {return Val-rhs;}
  360.  
  361.     // comparisons
  362.     bool __fastcall operator ==(const TDateTime& rhs) const
  363.     {return Val == rhs.Val;}
  364.     bool __fastcall operator !=(const TDateTime& rhs) const
  365.     {return Val != rhs.Val;}
  366.     bool __fastcall operator >(const TDateTime& rhs) const
  367.     {return Val > rhs.Val;}
  368.     bool __fastcall operator <(const TDateTime& rhs) const
  369.     {return Val < rhs.Val;}
  370.     bool __fastcall operator >=(const TDateTime& rhs) const
  371.     {return Val >= rhs.Val;}
  372.     bool __fastcall operator <=(const TDateTime& rhs) const
  373.     {return Val <= rhs.Val;}
  374.  
  375.     __fastcall operator AnsiString() const;//<Date||Time||DateTime>String(smart)
  376.     AnsiString __fastcall FormatString(const AnsiString& format);
  377.     AnsiString __fastcall DateString() const;
  378.     AnsiString __fastcall TimeString() const;
  379.     AnsiString __fastcall DateTimeString() const;
  380.     __fastcall operator double() const {return Val;}
  381.     __fastcall operator int() const    {return (int)Val;}
  382.  
  383.     int __fastcall DayOfWeek() const;
  384.     int __fastcall FileDate() const;
  385.     void __fastcall DecodeDate(unsigned short* year, unsigned short*
  386.                    month, unsigned short* day) const;
  387.     void __fastcall DecodeTime(unsigned short* hour, unsigned short*
  388.                    min, unsigned short* sec, unsigned short* msec) const;
  389.   };
  390.  
  391. // NOTE: Insertion/Extraction operators of VCL classes are only visible
  392. //       if VCL_IOSTREAM is defined.
  393. //
  394. #if defined(VCL_IOSTREAM)
  395.   ostream& operator <<(ostream& os, const TDateTime& arg);
  396.   istream& operator >>(istream& is, TDateTime& arg);
  397. #endif
  398.  
  399.  
  400.    typedef bool                 Boolean;          //
  401.    typedef int                  Integer;          // -2147483648..2147484647
  402.    typedef char                 Char;             // 0..255
  403.    typedef wchar_t              WideChar;         // Unicode character
  404.    typedef signed char          Shortint;         // -128..127
  405.    typedef short                Smallint;         // -32768..32767
  406.    typedef unsigned char        Byte;             // 0..255
  407.    typedef unsigned short       Word;             // 0..65535
  408.    typedef unsigned long        DWord;            // 0..4294967295
  409.    typedef void*                Pointer;          //
  410.    typedef char                 AnsiChar;         //
  411.    typedef signed long          Longint;          // -2147483648..2147484647
  412.    typedef unsigned int         Cardinal;         // 0..2147484647
  413.    typedef long double          Extended;         // 10 byte real
  414.    typedef float                Single;           // 4 byte real
  415.    typedef double               Double;           // 8 byte real
  416.    typedef char* const          Openstring;       // D16 string/D32 shortstring formalparm
  417.    typedef void*                file;             //
  418.    typedef void*                Text;             //
  419.    typedef Text                 TextFile;         //
  420.    typedef char*                PChar;            //
  421.    typedef char*                PAnsiChar;        //
  422.    typedef wchar_t*             PWideChar;        //
  423.    typedef unsigned char        ByteBool;         //
  424.    typedef unsigned short       WordBool;         //
  425.    typedef Cardinal             LongBool;         //
  426.    typedef AnsiString           String;           //
  427.    typedef SmallStringBase<255> ShortStringBase;  //
  428.    typedef SmallString<255>     ShortString;      //
  429.    typedef ShortString*         PShortString;     //
  430.    typedef AnsiString*          PAnsiString;      //
  431.    typedef PAnsiString          PString;          //
  432.    typedef WideString*          PWideString;      //
  433.    typedef Extended*            PExtended;        //
  434.    typedef Currency*            PCurrency;        //
  435.    typedef Variant*             PVariant;         //
  436.    typedef __int64              LONG64;           //
  437.    typedef GUID                 TGUID;            //
  438.    typedef TGUID*               PGUID;            //
  439.    typedef HRESULT              HResult;          //
  440.  
  441.   struct PACKAGE TInterfaceEntry
  442.   {
  443.     TGUID IID;
  444.     Pointer VTable;
  445.     int IOffset;
  446.   };
  447.   typedef TInterfaceEntry *PInterfaceEntry;
  448.  
  449.   struct PACKAGE TInterfaceTable
  450.   {
  451.     int EntryCount;
  452.     TInterfaceEntry Entries[];
  453.   };
  454.   typedef TInterfaceTable *PInterfaceTable;
  455.  
  456.  
  457.   // NOTE: Do not mess with TObject unless you really know what you're doing.
  458.   //       In particular, do not add, remove or change the order of virtual methods.
  459.   //
  460.   class DELPHICLASS TObject
  461.   {
  462.   public:
  463.             __fastcall  TObject(); /* Body provided by VCL {} */
  464.  
  465.             __fastcall Free();
  466.     TClass  __fastcall ClassType();
  467.     void    __fastcall CleanupInstance();
  468.     void *  __fastcall FieldAddress(const ShortString &Name);
  469.  
  470.     /*         class method */ static TObject * __fastcall InitInstance(TClass cls, void *instance);
  471.     /*         class method */ static ShortString __fastcall ClassName(TClass cls);
  472.     /*         class method */ static bool __fastcall ClassNameIs(TClass cls, const AnsiString string);
  473.     /*         class method */ static TClass __fastcall ClassParent(TClass cls);
  474.     /*         class method */ static void * __fastcall ClassInfo(TClass cls);
  475.     /*         class method */ static long __fastcall InstanceSize(TClass cls);
  476.     /*         class method */ static bool __fastcall InheritsFrom(TClass cls, TClass aClass);
  477.     /*         class method */ static void * __fastcall MethodAddress(TClass cls, const ShortString &Name);
  478.     /*         class method */ static ShortString __fastcall MethodName(TClass cls, void *Address);
  479.  
  480.     bool __fastcall GetInterface(const TGUID &IID, /* out */ void *Obj);
  481.  
  482.     /*         class method */ static PInterfaceEntry __fastcall GetInterfaceEntry(const TGUID IID);
  483.     /*         class method */ static PInterfaceTable * __fastcall GetInterfaceTable(void);
  484.  
  485.     ShortString __fastcall ClassName()
  486.     {
  487.       return ClassName(ClassType());
  488.     }
  489.  
  490.     bool __fastcall ClassNameIs(const AnsiString string)
  491.     {
  492.       return ClassNameIs(ClassType(), string);
  493.     }
  494.  
  495.     TClass __fastcall ClassParent()
  496.     {
  497.       return ClassParent(ClassType());
  498.     }
  499.  
  500.     void * __fastcall ClassInfo()
  501.     {
  502.       return ClassInfo(ClassType());
  503.     }
  504.  
  505.     long __fastcall InstanceSize()
  506.     {
  507.       return InstanceSize(ClassType());
  508.     }
  509.  
  510.     bool __fastcall InheritsFrom(TClass aClass)
  511.     {
  512.       return InheritsFrom(ClassType(), aClass);
  513.     }
  514.  
  515.     void * __fastcall MethodAddress(const ShortString &Name)
  516.     {
  517.       return MethodAddress(ClassType(), Name);
  518.     }
  519.  
  520.     ShortString __fastcall MethodName(void *Address)
  521.     {
  522.       return MethodName(ClassType(), Address);
  523.     }
  524.  
  525.     virtual HResult __fastcall SafeCallException(TObject *ExceptObject, void *ExceptAddr);
  526.     virtual void __fastcall AfterConstruction();
  527.     virtual void __fastcall BeforeDestruction();
  528.     virtual void __fastcall Dispatch(void *Message);
  529.     virtual void __fastcall DefaultHandler(void* Message);
  530.  
  531.   private:
  532.     virtual TObject* __fastcall NewInstance(TClass cls);
  533.  
  534.   public:
  535.     virtual void __fastcall FreeInstance();
  536.     virtual __fastcall ~TObject();  /* Body provided by VCL {} */
  537.   };
  538.  
  539.   class DELPHICLASS TInterfacedObject : TObject
  540.   {
  541.   private:
  542.     void    *IUnknown;
  543.     int     FRefCount;
  544.   protected:
  545.     virtual HResult __stdcall QueryInterface(const GUID& IID, /* out */ void *Obj);
  546.     virtual int __stdcall _AddRef(void);
  547.     virtual int __stdcall _Release(void);
  548.   public:
  549.     __property int RefCount       = { read=FRefCount };
  550.   };
  551.  
  552.   class PACKAGE TMetaClass
  553.   {
  554.   public:
  555.     TObject * __fastcall InitInstance(void *instance)
  556.     {
  557.       TObject::InitInstance(this, instance);
  558.     }
  559.  
  560.     ShortString __fastcall ClassName()
  561.     {
  562.       return TObject::ClassName(this);
  563.     }
  564.  
  565.     bool __fastcall ClassNameIs(const AnsiString &string)
  566.     {
  567.       return    TObject::ClassNameIs(this,string);
  568.     }
  569.  
  570.     TClass __fastcall ClassParent()
  571.     {
  572.       return TObject::ClassParent(this);
  573.     }
  574.  
  575.     void * __fastcall ClassInfo()
  576.     {
  577.       return TObject::ClassInfo(this);
  578.     }
  579.  
  580.     long __fastcall InstanceSize()
  581.     {
  582.       return TObject::InstanceSize(this);
  583.     }
  584.  
  585.     bool __fastcall InheritsFrom(TClass aClass)
  586.     {
  587.       return TObject::InheritsFrom(this, aClass);
  588.     }
  589.  
  590.     void * __fastcall MethodAddress(const ShortString &Name)
  591.     {
  592.       return TObject::MethodAddress(this, Name);
  593.     }
  594.  
  595.     ShortString __fastcall MethodName(void *Address)
  596.     {
  597.       return TObject::MethodName(this,Address);
  598.     }
  599.   };
  600.  
  601. #define BEGIN_MESSAGE_MAP   virtual void __fastcall Dispatch(void *Message) \
  602.         {                                           \
  603.           switch  (((PMessage)Message)->Msg)        \
  604.           {
  605.  
  606. #define VCL_MESSAGE_HANDLER(msg,type,meth)          \
  607.           case    msg:                              \
  608.             meth(*((type *)Message));               \
  609.             break;
  610.  
  611. // NOTE: ATL defines a MESSAGE_HANDLER macro which conflicts with VCL's macro. The
  612. //       VCL macro has been renamed to VCL_MESSAGE_HANDLER. If you are not using ATL,
  613. //       MESSAGE_HANDLER is defined as in previous versions of BCB.
  614. //
  615. #if !defined(USING_ATL) && !defined(USING_ATLVCL) && !defined(INC_ATL_HEADERS)
  616. #define MESSAGE_HANDLER  VCL_MESSAGE_HANDLER
  617. #endif // ATL_COMPAT
  618.  
  619. #define END_MESSAGE_MAP(base)           default:    \
  620.                         base::Dispatch(Message);    \
  621.                         break;                      \
  622.           }                                         \
  623.         }
  624.  
  625.  
  626. // Comp
  627. // Range: -263+1 .. 263-1, Significant digits: 19-20, Size: 8
  628. // The Comp (computational) type holds only integral values within -263+1
  629. // to 263-1, which is approximately -9.2 * 1018 to 9.2 * 1018.
  630. //
  631.   struct PACKAGE CompBase
  632.   {
  633.   protected:
  634.     char __data[8];
  635.   };
  636.  
  637.   struct PACKAGE Comp : public CompBase
  638.   {
  639.     operator =(double d);
  640.     operator =(Currency d);
  641.     operator double();
  642.     operator Currency();
  643.   };
  644.  
  645.   extern PACKAGE double   __cdecl CompToDouble(Comp acomp);
  646.   extern PACKAGE void     __cdecl DoubleToComp(double adouble, Comp &result);
  647.   extern PACKAGE Currency __cdecl CompToCurrency(Comp acomp);
  648.   extern PACKAGE void     __cdecl CurrencyToComp(Currency acurrency, Comp &result);
  649.  
  650.   inline Comp::operator = (double d) {
  651.     DoubleToComp(d, *this);
  652.   }
  653.  
  654.   inline Comp::operator double() {
  655.     return CompToDouble(*this);
  656.   }
  657.  
  658.   inline Comp::operator = (Currency d) {
  659.     CurrencyToComp(d, *this);
  660.   }
  661.  
  662.   inline Comp::operator Currency() {
  663.     return CompToCurrency(*this);
  664.   }
  665.  
  666.   // SetBase<> & Set<> are used to emulate Delphi set types
  667.  
  668.   template<class T, unsigned char minEl, unsigned char maxEl> class DELPHIRETURN SetBase
  669.   {
  670.   protected:
  671.     unsigned char Data[((((int)(maxEl/8))-((int)(minEl/8))+1) != 3)?
  672.                (((int)(maxEl/8))-((int)(minEl/8))+1): 4];
  673.   };
  674.  
  675.   template<class T, unsigned char minEl, unsigned char maxEl> class DELPHIRETURN Set : SetBase<T, minEl, maxEl>
  676.   {
  677.  
  678. // NOTE: Insertion/Extraction operators of VCL classes are only visible
  679. //       if VCL_IOSTREAM is defined.
  680. //
  681. #if defined(VCL_IOSTREAM)
  682.  
  683.     friend ostream& operator << (ostream& os, const Set& arg)
  684.     {
  685. #pragma option push -w-inl
  686.       for (int i = minEl; i <= maxEl; i++)
  687.         if (arg.Contains(static_cast<T>(i)))
  688.           os << '1';
  689.         else
  690.           os << '0';
  691.       return os;
  692. #pragma option pop
  693.     }
  694.  
  695.     friend istream& operator >> (istream& is, Set& arg)
  696.     {
  697. #pragma option push -w-inl
  698.       unsigned char el;
  699.       for (int i = minEl; i <= maxEl; i++)
  700.       {
  701.         is >> el;
  702.         if (el == '1')
  703.           arg << static_cast<T>(i);
  704.       }
  705.       return is;
  706. #pragma option pop
  707.     }
  708. #endif  // VCL_IOSTREAM
  709.  
  710.   public:
  711.     __fastcall Set() {memset(Data, 0, sizeof (Data));}
  712.     __fastcall Set(const Set& src)
  713.     {
  714. #pragma option push -w-inl
  715.       for (int i = 0; i < sizeof (Data); i++)
  716.         Data[i] = src.Data[i];
  717. #pragma option pop
  718.     }
  719.  
  720.     Set& __fastcall operator =(const Set& rhs)
  721.     {
  722. #pragma option push -w-inl
  723.       if (this != &rhs)
  724.       {
  725.         for (int i = 0; i < sizeof (Data); i++)
  726.           Data[i] = rhs.Data[i];
  727.       }
  728.       return *this;
  729. #pragma option pop
  730.     }
  731.     Set& __fastcall operator +=(const Set& rhs)     //Union
  732.     {
  733. #pragma option push -w-inl
  734.       for (int i = 0; i < sizeof (Data); i++)
  735.         Data[i] |= rhs.Data[i];
  736.       return *this;
  737. #pragma option pop
  738.     }
  739.     Set& __fastcall operator -=(const Set& rhs)     //Difference
  740.     {
  741. #pragma option push -w-inl
  742.       for (int i = 0; i < sizeof (Data); i++)
  743.         Data[i] ^= (Data[i] & rhs.Data[i]);
  744.       return *this;
  745. #pragma option pop
  746.     }
  747.     Set& __fastcall operator *=(const Set& rhs)     //Intersection
  748.     {
  749. #pragma option push -w-inl
  750.       for (int i = 0; i < sizeof (Data); i++)
  751.         Data[i] &= rhs.Data[i];
  752.       return *this;
  753. #pragma option pop
  754.     }
  755.  
  756.     Set __fastcall operator +(const Set& rhs) const //Union
  757.     {
  758. #pragma option push -w-inl
  759.       Set<T, minEl, maxEl> s;
  760.       for (int i = 0; i < sizeof (Data); i++)
  761.         s.Data[i] = Data[i] | rhs.Data[i];
  762.       return s;
  763. #pragma option pop
  764.     }
  765.     Set __fastcall operator -(const Set& rhs) const //Difference
  766.     {
  767. #pragma option push -w-inl
  768.       Set<T, minEl, maxEl> s;
  769.       for (int i = 0; i < sizeof (Data); i++)
  770.         s.Data[i] = Data[i] ^ (Data[i] & rhs.Data[i]);
  771.       return s;
  772. #pragma option pop
  773.     }
  774.     Set __fastcall operator *(const Set& rhs) const //Intersection
  775.     {
  776. #pragma option push -w-inl
  777.       Set<T, minEl, maxEl> s;
  778.       for (int i = 0; i < sizeof (Data); i++)
  779.         s.Data[i] = Data[i] & rhs.Data[i];
  780.       return s;
  781. #pragma option pop
  782.     }
  783.  
  784.     Set& __fastcall operator <<(const T el) //Add element
  785.     {
  786. #pragma warn -ccc
  787. #pragma warn -rng
  788.       if (el >= minEl && el <= maxEl)
  789. #pragma warn .ccc
  790. #pragma warn .rng
  791.         Data[(int)(el/8) - (int)(minEl/8)] |=
  792.         (unsigned char)((unsigned short)1 << (el % 8));
  793.       return *this;
  794.     }
  795.     Set& __fastcall operator >>(const T el) //Remove element
  796.     {
  797. #pragma warn -ccc
  798. #pragma warn -rng
  799.       if (el >= minEl && el <= maxEl)
  800. #pragma warn .ccc
  801. #pragma warn .rng
  802.         Data[(int)(el/8) - (int)(minEl/8)] &=
  803.         (unsigned char)~((unsigned short)1 << (el % 8));
  804.       return *this;
  805.     }
  806.  
  807.     bool __fastcall Contains(const T el) const
  808.     {
  809. #pragma warn -ccc
  810. #pragma warn -rng
  811.       return (el >= minEl && el <= maxEl)?
  812. #pragma warn .ccc
  813. #pragma warn .rng
  814.       (Data[(int)(el/8) - (int)(minEl/8)] &
  815.        (unsigned char)((unsigned short)1 << (el % 8))): false;
  816.     }
  817.  
  818.     Set& __fastcall Clear()
  819.     {
  820. #pragma option push -w-inl
  821.       for (int i = 0; i < sizeof (Data); i++)
  822.         Data[i] = 0;
  823.       return *this;
  824. #pragma option pop
  825.     }
  826.  
  827.     bool __fastcall operator ==(const Set& rhs) const
  828.     {
  829. #pragma option push -w-inl
  830.       for (int i = 0; i < sizeof (Data); i++)
  831.         if (Data[i] != rhs.Data[i])
  832.           // Not so fast, if first or last byte, make sure that
  833.           // the compare does not include unused bits (mask them)
  834.           if (i == 0)
  835.           {
  836.             if (((0xFF >> (8-(minEl%8))) ^ Data[i]) !=
  837.               ((0xFF >> (8-(minEl%8))) ^ rhs.Data[i]))
  838.               return false;
  839.           }
  840.           else if (sizeof (Data) > 1 && i == sizeof (Data) - 1)
  841.           {
  842.             if (((0xFF << (1+(maxEl%8))) ^ Data[i]) !=
  843.               ((0xFF << (1+(maxEl%8))) ^ rhs.Data[i]))
  844.               return false;
  845.           }
  846.           else
  847.             return false;
  848.       return true;
  849. #pragma option pop
  850.     }
  851.     bool __fastcall operator !=(const Set& rhs) const {return !operator==(rhs);}
  852.   };
  853.  
  854.   class PACKAGE TVarArrayBound
  855.   {
  856.   public:
  857.     Integer ElementCount;
  858.     Integer LowBound;
  859.   };
  860.  
  861.   typedef class TVarArray *PVarArray;
  862.  
  863.   class PACKAGE TVarArray
  864.   {
  865.   public:
  866.     Word DimCount;
  867.     Word Flags;
  868.     Integer ElementSize;
  869.     Integer LockCount;
  870.     Pointer Data;
  871.     TVarArrayBound Bounds[256] /* [0..255] */;
  872.   };
  873.  
  874. // Variant Type Descriptors
  875. //
  876. #define varEmpty      (Byte)(0)               //  VT_EMPTY
  877. #define varNull       (Byte)(1)               //  VT_NULL
  878. #define varSmallint   (Byte)(2)               //  VT_I2
  879. #define varInteger    (Byte)(3)               //  VT_I3
  880. #define varSingle     (Byte)(4)               //  VT_R4
  881. #define varDouble     (Byte)(5)               //  VT_R8
  882. #define varCurrency   (Byte)(6)               //  VT_CY
  883. #define varDate       (Byte)(7)               //  VT_DATE
  884. #define varOleStr     (Byte)(8)               //  VT_BSTR
  885. #define varDispatch   (Byte)(9)               //  VT_DISPATCH
  886. #define varError      (Byte)(10)              //  VT_ERROR
  887. #define varBoolean    (Byte)(11)              //  VT_BOOL
  888. #define varVariant    (Byte)(12)              //  VT_VARIANT
  889. #define varUnknown    (Byte)(13)              //  VT_UNKNOWN
  890. #define varByte       (Byte)(17)              //  VT_UI1
  891. #define varString     (Word)(256)             //  ??_??
  892. #define varTypeMask   (Word)(4095)            //  VT_TYPEMASK
  893. #define varArray      (Word)(8192)            //  VT_ARRAY
  894. #define varByRef      (Word)(16384)           //  VT_BYREF
  895. #define varStrArg     (Byte)(72)              //  VT_CLSID
  896.  
  897. #define vtInteger     (Byte)(0)
  898. #define vtBoolean     (Byte)(1)
  899. #define vtChar        (Byte)(2)
  900. #define vtExtended    (Byte)(3)
  901. #define vtString      (Byte)(4)
  902. #define vtPointer     (Byte)(5)
  903. #define vtPChar       (Byte)(6)
  904. #define vtObject      (Byte)(7)
  905. #define vtClass       (Byte)(8)
  906. #define vtWideChar    (Byte)(9)
  907. #define vtPWideChar   (Byte)(10)
  908. #define vtAnsiString  (Byte)(11)
  909. #define vtCurrency    (Byte)(12)
  910. #define vtVariant     (Byte)(13)
  911.  
  912.   typedef struct TVarData *PVarData;
  913.  
  914.   // TVarData = VARIANT
  915.   struct PACKAGE TVarData
  916.   {
  917.     union
  918.     {
  919.       Word        VType;      // Delphi-compatible - Variant Type member
  920.       VARTYPE     vt;         // tagVARIANT compatible member
  921.     };
  922.     Word Reserved1;
  923.     Word Reserved2;
  924.     Word Reserved3;
  925.     union
  926.     {
  927.       // Delphi-compatible Variant members
  928.       Smallint      VSmallint;        //  iVal
  929.       Integer       VInteger;         //  lVal
  930.       Single        VSingle;          //  fltVal
  931.       Double        VDouble;          //  dblVal
  932.       CurrencyBase  VCurrency;        //  cyVal
  933.       TDateTimeBase VDate;            //  date
  934.       PWideChar     VOleStr;          //  bstrVal
  935.       IDispatch*    VDispatch;        //  pdispVal
  936.       HResult       VError;           //  scode
  937.       WordBool      VBoolean;         //  boolVal
  938.       IUnknown*     VUnknown;         //  punkVal
  939.       Byte          VByte;            //  bVal
  940.       Pointer       VString;          //  ??????
  941.       PVarArray     VArray;           //  parray
  942.       Pointer       VPointer;         //  byref
  943.  
  944.       // tagVARIANT compatible members (from OAIDL.H)
  945.       // Allowing all types marked as [V] (may appear in a VARIANT to be initialized
  946.       LONG          lVal;
  947.       BYTE          bVal;
  948.       SHORT         iVal;
  949.       FLOAT         fltVal;
  950.       DOUBLE        dblVal;
  951.       VARIANT_BOOL  boolVal;
  952.       SCODE         scode;
  953.       CY            cyVal;
  954.       DATE          date;
  955.       BSTR          bstrVal;
  956.       IUnknown     *punkVal;
  957.       IDispatch    *pdispVal;
  958.       SAFEARRAY    *parray;
  959.       BYTE         *pbVal;
  960.       SHORT        *piVal;
  961.       LONG         *plVal;
  962.       FLOAT        *pfltVal;
  963.       DOUBLE       *pdblVal;
  964.       VARIANT_BOOL *pboolVal;
  965.       SCODE        *pscode;
  966.       CY           *pcyVal;
  967.       DATE         *pdate;
  968.       BSTR         *pbstrVal;
  969.       IUnknown    **ppunkVal;
  970.       IDispatch   **ppdispVal;
  971.       SAFEARRAY   **pparray;
  972.       VARIANT      *pvarVal;
  973.       PVOID         byref;
  974.       CHAR          cVal;
  975.       USHORT        uiVal;
  976.       ULONG         ulVal;
  977.       INT           intVal;
  978.       UINT          uintVal;
  979.       DECIMAL      *pdecVal;
  980.       CHAR         *pcVal;
  981.       USHORT       *puiVal;
  982.       ULONG        *pulVal;
  983.       INT          *pintVal;
  984.       UINT         *puintVal;
  985.     };
  986.   };
  987.  
  988.   class PACKAGE TVarRec;
  989.   typedef TVarRec* PVarRec;
  990.   class PACKAGE TVarRec
  991.   {
  992.   public:
  993.     union
  994.     {
  995.       Integer      VInteger;
  996.       Boolean      VBoolean;
  997.       Char         VChar;
  998.       PExtended    VExtended;
  999.       PShortString VString;
  1000.       Pointer      VPointer;
  1001.       PChar        VPChar;
  1002.       TObject*     VObject;
  1003.       TClass       VClass;
  1004.       WideChar     VWideChar;
  1005.       PWideChar    VPWideChar;
  1006.       Pointer      VAnsiString;
  1007.       PCurrency    VCurrency;
  1008.       PVariant     VVariant;
  1009.     };
  1010.     union
  1011.     {
  1012.       Byte VType;
  1013.       long ForceAlignment;
  1014. #if 0
  1015.       //! The ForceAlignment should be removed, if alignment set to 4
  1016.       //! we don't need this
  1017. #endif
  1018.     };
  1019.  
  1020.     //---- constructors ----
  1021.     __fastcall TVarRec(): VType(vtInteger), VInteger(0) {} //default int 0
  1022.     __fastcall TVarRec(Integer src): VType(vtInteger), VInteger(src) {}
  1023.     __fastcall TVarRec(Boolean src): VType(vtBoolean), VBoolean(src) {}
  1024.     __fastcall TVarRec(char src): VType(vtChar), VChar(src) {}
  1025.     __fastcall TVarRec(const Extended& src): VType(vtExtended),
  1026.     VExtended(const_cast<Extended*>(&src)) {}
  1027.     __fastcall TVarRec(const ShortString& src): VType(vtString),
  1028.     VString(const_cast<PShortString>(&src)) {}
  1029.     __fastcall TVarRec(const Pointer src): VType(vtPointer), VPointer(src) {}
  1030.     __fastcall TVarRec(const PChar src): VType(vtPChar), VPChar(src) {}
  1031.     __fastcall TVarRec(const char* src): VType(vtPChar),
  1032.     VPChar(reinterpret_cast<PChar>(const_cast<char*>(src))) {}
  1033.     __fastcall TVarRec(const TObject& src): VType(vtObject),
  1034.     VObject(const_cast<TObject*>(&src)) {}
  1035.     __fastcall TVarRec(const TClass src): VType(vtClass), VClass(src) {}
  1036.     __fastcall TVarRec(WideChar src): VType(vtWideChar), VWideChar(src) {}
  1037.     __fastcall TVarRec(const PWideChar src): VType(vtPWideChar),
  1038.     VPWideChar(src) {}
  1039.     __fastcall TVarRec(const AnsiString src): VType(vtAnsiString),
  1040.     VAnsiString(src.c_str()) {}
  1041.     __fastcall TVarRec(const Currency& src): VType(vtCurrency),
  1042.     VCurrency(const_cast<PCurrency>(&src)) {}
  1043.     __fastcall TVarRec(const Variant& src): VType(vtVariant),
  1044.     VVariant(const_cast<PVariant>(&src)) {}
  1045.  
  1046.     //---- assignments ----
  1047.     __fastcall operator =(Integer src) {VType = vtInteger; VInteger = src;}
  1048.     __fastcall operator =(Boolean src) {VType = vtBoolean; VBoolean = src;}
  1049.     __fastcall operator =(char src) {VType = vtChar; VChar = src;}
  1050.     __fastcall operator =(const Extended& src) {VType = vtExtended;
  1051.                           VExtended = const_cast<PExtended>(&src);}
  1052.     __fastcall operator =(const ShortString& src) {VType = vtString;
  1053.                           VString = const_cast<PShortString>(&src);}
  1054.     __fastcall operator =(const Pointer src) {VType = vtPointer;VPointer = src;}
  1055.     __fastcall operator =(const PChar src) {VType = vtPChar; VPChar = src;}
  1056.     __fastcall operator =(const char* src) {VType = vtPChar;
  1057.       VPChar = reinterpret_cast<PChar>(const_cast<char*>(src));}
  1058.     __fastcall operator =(const TObject& src) {VType = vtObject;
  1059.                           VObject = const_cast<TObject*>(&src);}
  1060.     __fastcall operator =(const TClass src) {VType = vtClass; VClass = src;}
  1061.     __fastcall operator =(WideChar src) {VType = vtWideChar; VWideChar = src;}
  1062.     __fastcall operator =(const PWideChar src) {VType = vtPWideChar;
  1063.                           VPWideChar = src;}
  1064.     __fastcall operator =(const AnsiString src) {VType = vtAnsiString;
  1065.                           VAnsiString = src.c_str();}
  1066.     __fastcall operator =(const Currency& src) {VType = vtCurrency;
  1067.                           VCurrency = const_cast<PCurrency>(&src);}
  1068.     __fastcall operator =(const Variant& src) {VType = vtVariant;
  1069.                           VVariant = const_cast<PVariant>(&src);}
  1070.   };
  1071.  
  1072.   template<class T> class OpenArray
  1073.   {
  1074.   public:
  1075.     __fastcall OpenArray(T arg0)
  1076.     {
  1077.       Array = new T[Count = 1];
  1078.       Array[0] = arg0;
  1079.     }
  1080.     __fastcall OpenArray(T arg0, T arg1)
  1081.     {
  1082.       Array = new T[Count = 2];
  1083.       Array[0] = arg0;
  1084.       Array[1] = arg1;
  1085.     }
  1086.     __fastcall OpenArray(T arg0, T arg1, T arg2)
  1087.     {
  1088.       Array = new T[Count = 3];
  1089.       Array[0] = arg0;
  1090.       Array[1] = arg1;
  1091.       Array[2] = arg2;
  1092.     }
  1093.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3)
  1094.     {
  1095.       Array = new T[Count = 4];
  1096.       Array[0] = arg0;
  1097.       Array[1] = arg1;
  1098.       Array[2] = arg2;
  1099.       Array[3] = arg3;
  1100.     }
  1101.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4)
  1102.     {
  1103.       Array = new T[Count = 5];
  1104.       Array[0] = arg0;
  1105.       Array[1] = arg1;
  1106.       Array[2] = arg2;
  1107.       Array[3] = arg3;
  1108.       Array[4] = arg4;
  1109.     }
  1110.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5)
  1111.     {
  1112.       Array = new T[Count = 6];
  1113.       Array[0] = arg0;
  1114.       Array[1] = arg1;
  1115.       Array[2] = arg2;
  1116.       Array[3] = arg3;
  1117.       Array[4] = arg4;
  1118.       Array[5] = arg5;
  1119.     }
  1120.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6)
  1121.     {
  1122.       Array = new T[Count = 7];
  1123.       Array[0] = arg0;
  1124.       Array[1] = arg1;
  1125.       Array[2] = arg2;
  1126.       Array[3] = arg3;
  1127.       Array[4] = arg4;
  1128.       Array[5] = arg5;
  1129.       Array[6] = arg6;
  1130.     }
  1131.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1132.                T arg7)
  1133.     {
  1134.       Array = new T[Count = 8];
  1135.       Array[0] = arg0;
  1136.       Array[1] = arg1;
  1137.       Array[2] = arg2;
  1138.       Array[3] = arg3;
  1139.       Array[4] = arg4;
  1140.       Array[5] = arg5;
  1141.       Array[6] = arg6;
  1142.       Array[7] = arg7;
  1143.     }
  1144.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1145.                T arg7, T arg8)
  1146.     {
  1147.       Array = new T[Count = 9];
  1148.       Array[0] = arg0;
  1149.       Array[1] = arg1;
  1150.       Array[2] = arg2;
  1151.       Array[3] = arg3;
  1152.       Array[4] = arg4;
  1153.       Array[5] = arg5;
  1154.       Array[6] = arg6;
  1155.       Array[7] = arg7;
  1156.       Array[8] = arg8;
  1157.     }
  1158.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1159.                T arg7, T arg8, T arg9)
  1160.     {
  1161.       Array = new T[Count = 10];
  1162.       Array[0] = arg0;
  1163.       Array[1] = arg1;
  1164.       Array[2] = arg2;
  1165.       Array[3] = arg3;
  1166.       Array[4] = arg4;
  1167.       Array[5] = arg5;
  1168.       Array[6] = arg6;
  1169.       Array[7] = arg7;
  1170.       Array[8] = arg8;
  1171.       Array[9] = arg9;
  1172.     }
  1173.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1174.                T arg7, T arg8, T arg9, T arg10)
  1175.     {
  1176.       Array = new T[Count = 11];
  1177.       Array[0] = arg0;
  1178.       Array[1] = arg1;
  1179.       Array[2] = arg2;
  1180.       Array[3] = arg3;
  1181.       Array[4] = arg4;
  1182.       Array[5] = arg5;
  1183.       Array[6] = arg6;
  1184.       Array[7] = arg7;
  1185.       Array[8] = arg8;
  1186.       Array[9] = arg9;
  1187.       Array[10] = arg10;
  1188.     }
  1189.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1190.                T arg7, T arg8, T arg9, T arg10, T arg11)
  1191.     {
  1192.       Array = new T[Count = 12];
  1193.       Array[0] = arg0;
  1194.       Array[1] = arg1;
  1195.       Array[2] = arg2;
  1196.       Array[3] = arg3;
  1197.       Array[4] = arg4;
  1198.       Array[5] = arg5;
  1199.       Array[6] = arg6;
  1200.       Array[7] = arg7;
  1201.       Array[8] = arg8;
  1202.       Array[9] = arg9;
  1203.       Array[10] = arg10;
  1204.       Array[11] = arg11;
  1205.     }
  1206.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1207.                T arg7, T arg8, T arg9, T arg10, T arg11, T arg12)
  1208.     {
  1209.       Array = new T[Count = 13];
  1210.       Array[0] = arg0;
  1211.       Array[1] = arg1;
  1212.       Array[2] = arg2;
  1213.       Array[3] = arg3;
  1214.       Array[4] = arg4;
  1215.       Array[5] = arg5;
  1216.       Array[6] = arg6;
  1217.       Array[7] = arg7;
  1218.       Array[8] = arg8;
  1219.       Array[9] = arg9;
  1220.       Array[10] = arg10;
  1221.       Array[11] = arg11;
  1222.       Array[12] = arg12;
  1223.     }
  1224.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1225.                T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1226.                T arg13)
  1227.     {
  1228.       Array = new T[Count = 14];
  1229.       Array[0] = arg0;
  1230.       Array[1] = arg1;
  1231.       Array[2] = arg2;
  1232.       Array[3] = arg3;
  1233.       Array[4] = arg4;
  1234.       Array[5] = arg5;
  1235.       Array[6] = arg6;
  1236.       Array[7] = arg7;
  1237.       Array[8] = arg8;
  1238.       Array[9] = arg9;
  1239.       Array[10] = arg10;
  1240.       Array[11] = arg11;
  1241.       Array[12] = arg12;
  1242.       Array[13] = arg13;
  1243.     }
  1244.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1245.                T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1246.                T arg13, T arg14)
  1247.     {
  1248.       Array = new T[Count = 15];
  1249.       Array[0] = arg0;
  1250.       Array[1] = arg1;
  1251.       Array[2] = arg2;
  1252.       Array[3] = arg3;
  1253.       Array[4] = arg4;
  1254.       Array[5] = arg5;
  1255.       Array[6] = arg6;
  1256.       Array[7] = arg7;
  1257.       Array[8] = arg8;
  1258.       Array[9] = arg9;
  1259.       Array[10] = arg10;
  1260.       Array[11] = arg11;
  1261.       Array[12] = arg12;
  1262.       Array[13] = arg13;
  1263.       Array[14] = arg14;
  1264.     }
  1265.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1266.                T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1267.                T arg13, T arg14, T arg15)
  1268.     {
  1269.       Array = new T[Count = 16];
  1270.       Array[0] = arg0;
  1271.       Array[1] = arg1;
  1272.       Array[2] = arg2;
  1273.       Array[3] = arg3;
  1274.       Array[4] = arg4;
  1275.       Array[5] = arg5;
  1276.       Array[6] = arg6;
  1277.       Array[7] = arg7;
  1278.       Array[8] = arg8;
  1279.       Array[9] = arg9;
  1280.       Array[10] = arg10;
  1281.       Array[11] = arg11;
  1282.       Array[12] = arg12;
  1283.       Array[13] = arg13;
  1284.       Array[14] = arg14;
  1285.       Array[15] = arg15;
  1286.     }
  1287.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1288.                T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1289.                T arg13, T arg14, T arg15, T arg16)
  1290.     {
  1291.       Array = new T[Count = 17];
  1292.       Array[0] = arg0;
  1293.       Array[1] = arg1;
  1294.       Array[2] = arg2;
  1295.       Array[3] = arg3;
  1296.       Array[4] = arg4;
  1297.       Array[5] = arg5;
  1298.       Array[6] = arg6;
  1299.       Array[7] = arg7;
  1300.       Array[8] = arg8;
  1301.       Array[9] = arg9;
  1302.       Array[10] = arg10;
  1303.       Array[11] = arg11;
  1304.       Array[12] = arg12;
  1305.       Array[13] = arg13;
  1306.       Array[14] = arg14;
  1307.       Array[15] = arg15;
  1308.       Array[16] = arg16;
  1309.     }
  1310.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1311.                T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1312.                T arg13, T arg14, T arg15, T arg16, T arg17)
  1313.     {
  1314.       Array = new T[Count = 18];
  1315.       Array[0] = arg0;
  1316.       Array[1] = arg1;
  1317.       Array[2] = arg2;
  1318.       Array[3] = arg3;
  1319.       Array[4] = arg4;
  1320.       Array[5] = arg5;
  1321.       Array[6] = arg6;
  1322.       Array[7] = arg7;
  1323.       Array[8] = arg8;
  1324.       Array[9] = arg9;
  1325.       Array[10] = arg10;
  1326.       Array[11] = arg11;
  1327.       Array[12] = arg12;
  1328.       Array[13] = arg13;
  1329.       Array[14] = arg14;
  1330.       Array[15] = arg15;
  1331.       Array[16] = arg16;
  1332.       Array[17] = arg17;
  1333.     }
  1334.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1335.                T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1336.                T arg13, T arg14, T arg15, T arg16, T arg17, T arg18)
  1337.     {
  1338.       Array = new T[Count = 19];
  1339.       Array[0] = arg0;
  1340.       Array[1] = arg1;
  1341.       Array[2] = arg2;
  1342.       Array[3] = arg3;
  1343.       Array[4] = arg4;
  1344.       Array[5] = arg5;
  1345.       Array[6] = arg6;
  1346.       Array[7] = arg7;
  1347.       Array[8] = arg8;
  1348.       Array[9] = arg9;
  1349.       Array[10] = arg10;
  1350.       Array[11] = arg11;
  1351.       Array[12] = arg12;
  1352.       Array[13] = arg13;
  1353.       Array[14] = arg14;
  1354.       Array[15] = arg15;
  1355.       Array[16] = arg16;
  1356.       Array[17] = arg17;
  1357.       Array[18] = arg18;
  1358.     }
  1359.     __fastcall OpenArray(const OpenArray& src)
  1360.     {
  1361.       Array = new T[Count = src.Count];
  1362.       for (int i = 0; i < Count; i++)
  1363.         Array[i] = src.Array[i];
  1364.     }
  1365.     __fastcall ~OpenArray() {delete [] Array;}
  1366.     OpenArray& __fastcall operator =(const OpenArray& rhs);
  1367.     __fastcall operator T*() {return Array;}
  1368.     int __fastcall GetHigh() {return Count - 1;}
  1369.  
  1370.   private:
  1371.     T* Array;
  1372.     long Count;
  1373.   };
  1374.  
  1375.   template<class T>
  1376.   OpenArray& __fastcall
  1377.   OpenArray<T>::operator =(const OpenArray& rhs)
  1378.   {
  1379.     if (this != &rhs)
  1380.     {
  1381.       Array = new T[Count = rhs.Count];
  1382.       for (int i = 0; i < Count; i++)
  1383.         Array[i] = rhs.Array[i];
  1384.     }
  1385.     return *this;
  1386.   }
  1387.  
  1388. // Used with OPENARRAY macro (immediately following this template declaration)
  1389.   template<class T> class OpenArrayCount
  1390.   {
  1391.   public:
  1392.     __fastcall OpenArrayCount(T arg0): Count(1) {}
  1393.     __fastcall OpenArrayCount(T arg0,T arg1): Count(2) {}
  1394.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2): Count(3) {}
  1395.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2,T arg3): Count(4) {}
  1396.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2,T arg3,T arg4): Count(5) {}
  1397.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2,T arg3,T arg4, T arg5)
  1398.     : Count(6) {}
  1399.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1400.                   T arg6): Count(7) {}
  1401.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1402.                   T arg6, T arg7): Count(8) {}
  1403.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1404.                   T arg6, T arg7, T arg8): Count(9) {}
  1405.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1406.                   T arg6, T arg7, T arg8, T arg9): Count(10) {}
  1407.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1408.                   T arg6, T arg7, T arg8, T arg9, T arg10): Count(11) {}
  1409.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1410.                   T arg6, T arg7, T arg8, T arg9, T arg10, T arg11): Count(12) {}
  1411.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1412.                   T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12): Count(13) {}
  1413.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1414.                   T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13)
  1415.     : Count(14) {}
  1416.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1417.                   T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1418.                   T arg14): Count(15) {}
  1419.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1420.                   T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1421.                   T arg14, T arg15): Count(16) {}
  1422.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1423.                   T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1424.                   T arg14, T arg15, T arg16): Count(17) {}
  1425.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1426.                   T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1427.                   T arg14, T arg15, T arg16, T arg17): Count(18) {}
  1428.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1429.                   T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1430.                   T arg14, T arg15, T arg16, T arg17, T arg18): Count(19) {}
  1431.     int __fastcall GetHigh() {return Count - 1;}
  1432.   private:
  1433.     long Count;
  1434.   };
  1435.  
  1436. // OPENARRAY: construct an OpenArray<type> on the fly
  1437. #define OPENARRAY(type, values) \
  1438.   OpenArray<type>values, OpenArrayCount<type>values.GetHigh()
  1439.  
  1440. // ARRAYOFCONST: construct an OpenArray<TVarRec> on the fly
  1441. #define ARRAYOFCONST(values) \
  1442.   OpenArray<TVarRec>values, OpenArrayCount<TVarRec>values.GetHigh()
  1443.  
  1444. #define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
  1445.  
  1446. // EXISTINGARRAY: pass an existing array where an open array is expected
  1447. #define EXISTINGARRAY(a) (a), ((sizeof(a)/sizeof(a[0]))-1)
  1448.  
  1449. // SLICE: pass part of an existing array where an open array is expected
  1450. #define SLICE(a, n) (a), (n - 1)
  1451.  
  1452.   // Encapsulates error code to be stored in Variant
  1453.   //
  1454.   class VariantError
  1455.   {
  1456.   public:
  1457.     VariantError(SCODE err = DISP_E_PARAMNOTFOUND) : m_scode(err)
  1458.     {}
  1459.     operator SCODE () const
  1460.     {
  1461.        return m_scode;
  1462.     }
  1463.     VariantError& operator = (SCODE err)
  1464.     {
  1465.       m_scode = err;
  1466.       return *this;
  1467.     }
  1468.  
  1469.   protected:
  1470.     SCODE m_scode;
  1471.   };
  1472.  
  1473.   class PACKAGE AutoCmd;
  1474.  
  1475.   class DELPHIRETURN Variant: public TVarData
  1476.   {
  1477.     friend class PACKAGE AutoCmd;
  1478.  
  1479. // NOTE: Insertion/Extraction operators of VCL classes are only visible
  1480. //       if VCL_IOSTREAM is defined.
  1481. //
  1482. #if defined(VCL_IOSTREAM)
  1483.     friend ostream& operator << (ostream& os, const Variant& arg);
  1484. #endif
  1485.  
  1486.   public:
  1487.     static Variant __fastcall CreateObject(const String& ProgID);
  1488.     static Variant __fastcall GetActiveObject(const String& ProgID);
  1489.  
  1490.     // Default Ctr
  1491.     __fastcall Variant();
  1492.  
  1493.     // Copy Ctr
  1494.     __fastcall Variant(const Variant& src);
  1495.  
  1496.     // Ctr - From basic C++ types
  1497.     __fastcall Variant(const bool src);
  1498.  
  1499.     __fastcall Variant(const char src);
  1500.     __fastcall Variant(const signed char src);
  1501.     __fastcall Variant(const unsigned char src);
  1502.  
  1503.     __fastcall Variant(const short src);
  1504.     __fastcall Variant(const unsigned short src);
  1505.  
  1506.     __fastcall Variant(const int src);
  1507.     __fastcall Variant(const unsigned int src);
  1508.  
  1509.     __fastcall Variant(const long src);
  1510.     __fastcall Variant(const unsigned long src);
  1511.  
  1512.     __fastcall Variant(const float src);
  1513.     __fastcall Variant(const double src);
  1514.     __fastcall Variant(const long double src);
  1515.  
  1516.     // Ctr - From OLE structures
  1517.     __fastcall Variant(const CURRENCY& src);
  1518.     __fastcall Variant(SAFEARRAY& src);
  1519.     __fastcall Variant(SAFEARRAY* src);
  1520.     __fastcall Variant(const VARIANT& src);
  1521.     __fastcall Variant(VARIANT*   src);
  1522.  
  1523.     // Ctr - From utility classes
  1524.     __fastcall Variant(const AnsiString& src);
  1525.     __fastcall Variant(const Currency& src);
  1526.     __fastcall Variant(const TDateTime& src);
  1527.     __fastcall Variant(const VariantError& src);
  1528.     __fastcall Variant(const WideString& src);
  1529.  
  1530.     // Asciiz pointer
  1531.     __fastcall Variant(const char* src);            // Treated as pointer Asciiz string
  1532.  
  1533.     // Ctr - OLE ptrs
  1534.     __fastcall Variant(wchar_t* src);               // BSTR support
  1535.     __fastcall Variant(IUnknown* src);
  1536.     __fastcall Variant(IDispatch* src);
  1537.  
  1538.     // Ref-counted Dispatch interface object
  1539.     __fastcall Variant(const System::DelphiInterface<IDispatch>& src);
  1540.  
  1541.     //By ref constructors
  1542.     __fastcall Variant(signed char* src);
  1543.     __fastcall Variant(unsigned char* src);
  1544.  
  1545.     __fastcall Variant(short* src);
  1546.     __fastcall Variant(unsigned short* src);
  1547.  
  1548.     __fastcall Variant(int* src);
  1549.     __fastcall Variant(unsigned int* src);
  1550.  
  1551.     __fastcall Variant(long* src);
  1552.     __fastcall Variant(unsigned long* src);
  1553.  
  1554.     __fastcall Variant(float* src);
  1555.     __fastcall Variant(double* src);
  1556.  
  1557.     __fastcall Variant(CURRENCY* src);
  1558.     __fastcall Variant(SAFEARRAY** src);
  1559.  
  1560.     __fastcall Variant(wchar_t** src);              // VT_BSTR|VT_BYREF
  1561.  
  1562.     // Ref Vcl classes
  1563.     __fastcall Variant(Currency* src);
  1564.     __fastcall Variant(TDateTime* src);
  1565.  
  1566.     // Constructor for array of variants of type varType
  1567.     __fastcall Variant(const int* bounds, const int boundsSize, Word varType);
  1568.  
  1569.     // Constructor for one dimensional array of type Variant
  1570.     __fastcall Variant(const Variant* values, const int valuesSize);
  1571.  
  1572.     __fastcall ~Variant();
  1573.  
  1574.     // Assignments
  1575.     Variant& __fastcall operator =(const Variant& rhs);
  1576.  
  1577.     Variant& __fastcall operator =(const bool src);
  1578.  
  1579.     Variant& __fastcall operator =(const char src);
  1580.     Variant& __fastcall operator =(const signed char src);
  1581.     Variant& __fastcall operator =(const unsigned char src);
  1582.  
  1583.     Variant& __fastcall operator =(const short src);
  1584.     Variant& __fastcall operator =(const unsigned short src);
  1585.  
  1586.     Variant& __fastcall operator =(const int src);
  1587.     Variant& __fastcall operator =(const unsigned int src);
  1588.  
  1589.     Variant& __fastcall operator =(const long src);
  1590.     Variant& __fastcall operator =(const unsigned long src);
  1591.  
  1592.     Variant& __fastcall operator =(const float src);
  1593.     Variant& __fastcall operator =(const double src);
  1594.  
  1595.     Variant& __fastcall operator =(const CURRENCY& src);
  1596.     Variant& __fastcall operator =(SAFEARRAY* src);
  1597.     Variant& __fastcall operator =(SAFEARRAY& src);
  1598.     Variant& __fastcall operator =(VARIANT& rhs);
  1599.     Variant& __fastcall operator =(VARIANT* rhs);
  1600.  
  1601.     Variant& __fastcall operator =(const AnsiString& src);
  1602.     Variant& __fastcall operator =(const Currency& src);
  1603.     Variant& __fastcall operator =(const TDateTime& src);
  1604.     Variant& __fastcall operator =(const VariantError& src);
  1605.     Variant& __fastcall operator =(const WideString& src);
  1606.     Variant& __fastcall operator =(const System::DelphiInterface<IDispatch>& src);
  1607.  
  1608.  
  1609.     Variant& __fastcall operator =(wchar_t* src);             // BSTR support
  1610.     Variant& __fastcall operator =(IUnknown* src);
  1611.     Variant& __fastcall operator =(IDispatch* src);
  1612.  
  1613.     // By ref Assignment
  1614.     Variant& __fastcall operator =(const char* src);          // Treated as pointer Asciiz string
  1615.     Variant& __fastcall operator =(signed char* src);     
  1616.     Variant& __fastcall operator =(unsigned char* src);
  1617.  
  1618.     Variant& __fastcall operator =(short* src);
  1619.     Variant& __fastcall operator =(unsigned short* src);
  1620.  
  1621.     Variant& __fastcall operator =(int* src);
  1622.     Variant& __fastcall operator =(unsigned int* src);
  1623.  
  1624.     Variant& __fastcall operator =(long* src);
  1625.     Variant& __fastcall operator =(unsigned long* src);
  1626.  
  1627.     Variant& __fastcall operator =(float* src);
  1628.     Variant& __fastcall operator =(double* src);
  1629.  
  1630.     Variant& __fastcall operator =(CURRENCY* src);
  1631.     Variant& __fastcall operator =(SAFEARRAY** src);
  1632.  
  1633.     Variant& __fastcall operator =(wchar_t** src);            // VT_BSTR|VT_BYREF
  1634.     Variant& __fastcall operator =(IUnknown** src);
  1635.     Variant& __fastcall operator =(IDispatch** src);
  1636.  
  1637.     Variant& __fastcall operator =(Currency* src);
  1638.     Variant& __fastcall operator =(TDateTime* src);
  1639.  
  1640.     // Exotic operators
  1641.     Variant& __fastcall operator +=(const Variant& rhs);
  1642.     Variant& __fastcall operator -=(const Variant& rhs);
  1643.     Variant& __fastcall operator *=(const Variant& rhs);
  1644.     Variant& __fastcall operator /=(const Variant& rhs);
  1645.     Variant& __fastcall operator %=(const Variant& rhs);
  1646.     Variant& __fastcall operator &=(const Variant& rhs);
  1647.     Variant& __fastcall operator |=(const Variant& rhs);
  1648.     Variant& __fastcall operator ^=(const Variant& rhs);
  1649.     Variant& __fastcall operator <<=(const Variant& rhs);
  1650.     Variant& __fastcall operator >>=(const Variant& rhs);
  1651.  
  1652.     // comparisons (Variant on right)
  1653.     bool __fastcall operator ==(const Variant& rhs) const;
  1654.     bool __fastcall operator !=(const Variant& rhs) const;
  1655.     bool __fastcall operator < (const Variant& rhs) const;
  1656.     bool __fastcall operator > (const Variant& rhs) const;
  1657.     bool __fastcall operator <=(const Variant& rhs) const;
  1658.     bool __fastcall operator >=(const Variant& rhs) const;
  1659.  
  1660.     // comparisons (int on right)
  1661.     bool __fastcall operator ==(int rhs) const
  1662.     {return operator ==(Variant(rhs));}
  1663.     bool __fastcall operator !=(int rhs) const
  1664.     {return operator !=(Variant(rhs));}
  1665.     bool __fastcall operator < (int rhs) const
  1666.     {return operator < (Variant(rhs));}
  1667.     bool __fastcall operator > (int rhs) const
  1668.     {return operator > (Variant(rhs));}
  1669.     bool __fastcall operator <=(int rhs) const
  1670.     {return operator <=(Variant(rhs));}
  1671.     bool __fastcall operator >=(int rhs) const
  1672.     {return operator >=(Variant(rhs));}
  1673.  
  1674.     // comparisons (string on right)
  1675.     bool __fastcall operator ==(const AnsiString& rhs) const
  1676.     { return AnsiString(*this) == rhs;}
  1677.  
  1678.     // comparisons (double on right)
  1679.     bool __fastcall operator ==(double rhs) const
  1680.     {return operator ==(Variant(rhs));}
  1681.     bool __fastcall operator !=(double rhs) const
  1682.     {return operator !=(Variant(rhs));}
  1683.     bool __fastcall operator < (double rhs) const
  1684.     {return operator <(Variant(rhs));}
  1685.     bool __fastcall operator > (double rhs) const
  1686.     {return operator >(Variant(rhs));}
  1687.     bool __fastcall operator <=(double rhs) const
  1688.     {return operator <=(Variant(rhs));}
  1689.     bool __fastcall operator >=(double rhs) const
  1690.     {return operator >=(Variant(rhs));}
  1691.  
  1692.     // binary operators (Variant on right)
  1693.     Variant __fastcall operator +(const Variant& rhs) const;
  1694.     Variant __fastcall operator -(const Variant& rhs) const;
  1695.     Variant __fastcall operator *(const Variant& rhs) const;
  1696.     Variant __fastcall operator /(const Variant& rhs) const;
  1697.     Variant __fastcall operator %(const Variant& rhs) const;
  1698.     Variant __fastcall operator &(const Variant& rhs) const;
  1699.     Variant __fastcall operator |(const Variant& rhs) const;
  1700.     Variant __fastcall operator ^(const Variant& rhs) const;
  1701.     Variant __fastcall operator <<(const Variant& rhs) const;
  1702.     Variant __fastcall operator >>(const Variant& rhs) const;
  1703.  
  1704.     // binary operators (AnsiString on right)
  1705.     Variant __fastcall operator -(const AnsiString& rhs) const
  1706.     {return operator -(Variant(rhs));}
  1707.     Variant __fastcall operator *(const AnsiString& rhs) const
  1708.     {return operator *(Variant(rhs));}
  1709.     Variant __fastcall operator /(const AnsiString& rhs) const
  1710.     {return operator /(Variant(rhs));}
  1711.     Variant __fastcall operator %(const AnsiString& rhs) const
  1712.     {return operator %(Variant(rhs));}
  1713.     Variant __fastcall operator &(const AnsiString& rhs) const
  1714.     {return operator &(Variant(rhs));}
  1715.     Variant __fastcall operator |(const AnsiString& rhs) const
  1716.     {return operator |(Variant(rhs));}
  1717.     Variant __fastcall operator ^(const AnsiString& rhs) const
  1718.     {return operator ^(Variant(rhs));}
  1719.     Variant __fastcall operator <<(const AnsiString& rhs) const
  1720.     {return operator <<(Variant(rhs));}
  1721.     Variant __fastcall operator >>(const AnsiString& rhs) const
  1722.     {return operator >>(Variant(rhs));}
  1723.  
  1724.     // binary operators (int on right)
  1725.     Variant __fastcall operator +(int rhs) const
  1726.     {return operator +(Variant(rhs));}
  1727.     Variant __fastcall operator -(int rhs) const
  1728.     {return operator -(Variant(rhs));}
  1729.     Variant __fastcall operator *(int rhs) const
  1730.     {return operator *(Variant(rhs));}
  1731.     Variant __fastcall operator /(int rhs) const
  1732.     {return operator /(Variant(rhs));}
  1733.     Variant __fastcall operator %(int rhs) const
  1734.     {return operator %(Variant(rhs));}
  1735.     Variant __fastcall operator &(int rhs) const
  1736.     {return operator &(Variant(rhs));}
  1737.     Variant __fastcall operator |(int rhs) const
  1738.     {return operator |(Variant(rhs));}
  1739.     Variant __fastcall operator ^(int rhs) const
  1740.     {return operator ^(Variant(rhs));}
  1741.     Variant __fastcall operator <<(int rhs) const
  1742.     {return operator <<(Variant(rhs));}
  1743.     Variant __fastcall operator >>(int rhs) const
  1744.     {return operator >>(Variant(rhs));}
  1745.  
  1746.     // binary operators (double on right)
  1747.     Variant __fastcall operator +(double rhs) const
  1748.     {return operator +(Variant(rhs));}
  1749.     Variant __fastcall operator -(double rhs) const
  1750.     {return operator -(Variant(rhs));}
  1751.     Variant __fastcall operator *(double rhs) const
  1752.     {return operator *(Variant(rhs));}
  1753.     Variant __fastcall operator /(double rhs) const
  1754.     {return operator /(Variant(rhs));}
  1755.     Variant __fastcall operator %(double rhs) const
  1756.     {return operator %(Variant(rhs));}
  1757.     Variant __fastcall operator &(double rhs) const
  1758.     {return operator &(Variant(rhs));}
  1759.     Variant __fastcall operator |(double rhs) const
  1760.     {return operator |(Variant(rhs));}
  1761.     Variant __fastcall operator ^(double rhs) const
  1762.     {return operator ^(Variant(rhs));}
  1763.     Variant __fastcall operator <<(double rhs) const
  1764.     {return operator <<(Variant(rhs));}
  1765.     Variant __fastcall operator >>(double rhs) const
  1766.     {return operator >>(Variant(rhs));}
  1767.  
  1768.     // unary operators
  1769.     Variant __fastcall operator -() const;
  1770.     Variant __fastcall operator !() const;
  1771.  
  1772.     // Conversion operators
  1773.     __fastcall operator bool()            const;
  1774.  
  1775.     __fastcall operator char()            const;
  1776.     __fastcall operator signed char()     const;
  1777.     __fastcall operator unsigned char()   const;
  1778.  
  1779.     __fastcall operator short()           const;
  1780.     __fastcall operator unsigned short()  const;
  1781.  
  1782.     __fastcall operator int()             const;
  1783.     __fastcall operator unsigned int()    const;
  1784.  
  1785.     __fastcall operator long()            const;
  1786.     __fastcall operator unsigned long()   const;
  1787.  
  1788.     __fastcall operator float()           const;
  1789.     __fastcall operator double()          const;
  1790.  
  1791.     __fastcall operator AnsiString()      const;
  1792.     __fastcall operator Currency()        const;
  1793.     __fastcall operator TDateTime()       const;
  1794.     __fastcall operator WideString()      const;
  1795.  
  1796.     __fastcall operator CURRENCY()        const;
  1797.     __fastcall operator VARIANT();
  1798.  
  1799.     __fastcall operator wchar_t*()        const;
  1800.     __fastcall operator IDispatch*();
  1801.     __fastcall operator IUnknown*();
  1802.  
  1803.     // by ref conversion operators
  1804.     /*__fastcall operator char*();*/  // Dangerous - easily used as string instead of VT_I1|VT_BYREF
  1805.     __fastcall operator signed char*();
  1806.     __fastcall operator unsigned char*();
  1807.  
  1808.  
  1809.     __fastcall operator short*();
  1810.     __fastcall operator unsigned short*();
  1811.  
  1812.     __fastcall operator int*();
  1813.     __fastcall operator unsigned int*();
  1814.  
  1815.     __fastcall operator long*();
  1816.     __fastcall operator unsigned long*();
  1817.  
  1818.     __fastcall operator float*();
  1819.     __fastcall operator double*();
  1820.  
  1821.     /*__fastcall operator CURRENCY*()       const;*/
  1822.     /*__fastcall operator SAFEARRAY**()     const;*/
  1823.     __fastcall operator VARIANT*();
  1824.  
  1825.     __fastcall operator Currency*();
  1826.     __fastcall operator TDateTime*();
  1827.     __fastcall operator wchar_t**();
  1828.  
  1829.     // HRESULT methods
  1830.     //
  1831.     void    __fastcall SetError(const HResult err);
  1832.     HResult __fastcall GetError() const;
  1833.  
  1834.     // Manipulate/Set vt_xxx Type
  1835.     //
  1836.     void      __fastcall Clear();
  1837.     Variant&  __fastcall ChangeType(int VarType);
  1838.     Variant   __fastcall AsType(int VarType) const;
  1839.  
  1840.     // Query vt_xxx Type
  1841.     //
  1842.     int   __fastcall Type()     const;
  1843.     bool  __fastcall IsNull()   const;
  1844.     bool  __fastcall IsEmpty()  const;
  1845.  
  1846.     // Get Base Variant (when vt==VT_VARIANT)
  1847.     //
  1848.     Variant* __fastcall GetBaseVariant();
  1849.  
  1850.     // Array support
  1851.     //
  1852.     bool    __fastcall IsArray() const;
  1853.     Variant __fastcall GetElement(const int i1) const;
  1854.     Variant __fastcall GetElement(const int i1, const int i2) const;
  1855.     Variant __fastcall GetElement(const int i1, const int i2, const int i3) const;
  1856.     Variant __fastcall GetElement(const int i1, const int i2, const int i3, const int i4) const;
  1857.     Variant __fastcall GetElement(const int i1, const int i2, const int i3, const int i4, const int i5) const;
  1858.     void    __fastcall PutElement(const Variant& data, const int i1);
  1859.     void    __fastcall PutElement(const Variant& data, const int i1, const int i2);
  1860.     void    __fastcall PutElement(const Variant& data, const int i1, const int i2,const int i3);
  1861.     void    __fastcall PutElement(const Variant& data, const int i1, const int i2,const int i3, const int i4);
  1862.     void    __fastcall PutElement(const Variant& data, const int i1, const int i2,const int i3, const int i4, const int i5);
  1863.  
  1864.     int     __fastcall ArrayDimCount() const;
  1865.     int     __fastcall ArrayLowBound(const int dim = 1) const;
  1866.     int     __fastcall ArrayHighBound(const int dim = 1) const;
  1867.     void    __fastcall ArrayRedim(int highBound);
  1868.     Pointer __fastcall ArrayLock();
  1869.     void    __fastcall ArrayUnlock();
  1870.  
  1871.     // Automation Goodies
  1872.     //
  1873.     Variant __fastcall Exec(AutoCmd& cmd, Integer lcid = LOCALE_SYSTEM_DEFAULT) const;
  1874.  
  1875.     // Alternate Syntax for Automation
  1876.     // (Doesn't support Named Parameters)
  1877.     //
  1878.     void OleProcedure(const String& name, Variant& v0 = Empty(),
  1879.                       Variant& v1 = Empty(),Variant& v2 = Empty(),Variant& v3 = Empty(),
  1880.                       Variant& v4 = Empty(),Variant& v5 = Empty(),Variant& v6 = Empty(),
  1881.                       Variant& v7 = Empty(),Variant& v8 = Empty(),Variant& v9 = Empty()) const;
  1882.     Variant OleFunction(const String& name, Variant& v0 = Empty(),
  1883.                       Variant& v1 = Empty(),Variant& v2 = Empty(),Variant& v3 = Empty(),
  1884.                       Variant& v4 = Empty(),Variant& v5 = Empty(),Variant& v6 = Empty(),
  1885.                       Variant& v7 = Empty(),Variant& v8 = Empty(),Variant& v9 = Empty()) const;
  1886.     Variant OlePropertyGet(const String& name, Variant& v0 = Empty(),
  1887.                       Variant& v1 = Empty(),Variant& v2 = Empty(),Variant& v3 = Empty(),
  1888.                       Variant& v4 = Empty(),Variant& v5 = Empty(),Variant& v6 = Empty(),
  1889.                       Variant& v7 = Empty(),Variant& v8 = Empty(),Variant& v9 = Empty()) const;
  1890.     void OlePropertySet(const String& name, Variant& v0 = Empty(),
  1891.                       Variant& v1 = Empty(),Variant& v2 = Empty(),Variant& v3 = Empty(),
  1892.                       Variant& v4 = Empty(),Variant& v5 = Empty(),Variant& v6 = Empty(),
  1893.                       Variant& v7 = Empty(),Variant& v8 = Empty(),Variant& v9 = Empty()) const;
  1894.     // End of Alternate Syntax for Automation
  1895.  
  1896.     // Ref. to Variant which can be used for non-specified optional parameters or 'Empty' parameters
  1897.     static Variant& NoParam();
  1898.     static Variant& Empty();
  1899.  
  1900.   private:
  1901.     // AutoCmd::GetParm & GetNamedParm uses operator [] (AutoCmd is a friend)
  1902.     // operator[] can only be used for arrays of type Variant
  1903.     Variant& __fastcall operator [](const int idx);
  1904.   };
  1905.  
  1906.  
  1907. // Sanity check
  1908. //#if sizeof(Variant) != sizeof(VARIANT)
  1909. //#pragma message("sizeof(Variant) != sizeof(VARIANT)")
  1910. //#endif
  1911.  
  1912.  
  1913.   class DELPHIRETURN OleVariant: protected Variant
  1914.   {
  1915.   public:
  1916.     __fastcall OleVariant()                     : Variant()     {}
  1917.     __fastcall OleVariant(const OleVariant& src): Variant(src)  {}
  1918.     __fastcall OleVariant(const Variant& src)   : Variant(src)  {
  1919.       // Switch to BSTR if we're an AnsiString Variant
  1920.       //
  1921.       if (Type() == varString)
  1922.         ChangeType(varOleStr);
  1923.     }
  1924.  
  1925.     //By value constructors
  1926.     __fastcall OleVariant(const short src)      : Variant(src)  {}
  1927.     __fastcall OleVariant(const int src)        : Variant(src)  {}
  1928.     __fastcall OleVariant(const float src)      : Variant(src)  {}
  1929.     __fastcall OleVariant(const double src)     : Variant(src)  {}
  1930.     __fastcall OleVariant(const Currency src)   : Variant(src)  {}
  1931.     __fastcall OleVariant(const TDateTime src)  : Variant(src)  {}
  1932.     __fastcall OleVariant(const WideString& src): Variant(src)  {}
  1933.     __fastcall OleVariant(const bool src)       : Variant(src)  {}
  1934.     __fastcall OleVariant(const Byte src)       : Variant(src)  {}
  1935.  
  1936.  
  1937.     __fastcall OleVariant(wchar_t* const src)   : Variant(src)  {}
  1938.     __fastcall OleVariant(IDispatch* const src) : Variant(src)  {}
  1939.     __fastcall OleVariant(IUnknown* const src)  : Variant(src)  {}
  1940.     __fastcall OleVariant(VARIANT* src)         : Variant(src)  {}
  1941.  
  1942.     //By ref constructors
  1943.     __fastcall OleVariant(short* src)           : Variant(src)  {}
  1944.     __fastcall OleVariant(int* src)             : Variant(src)  {}
  1945.     __fastcall OleVariant(float* src)           : Variant(src)  {}
  1946.     __fastcall OleVariant(double* src)          : Variant(src)  {}
  1947.     __fastcall OleVariant(Currency* src)        : Variant(src)  {}
  1948.     __fastcall OleVariant(TDateTime* src)       : Variant(src)  {}
  1949.     __fastcall OleVariant(WordBool* src)        : Variant(src)  {}
  1950.     __fastcall OleVariant(Byte* src)            : Variant(src)  {}
  1951.     __fastcall OleVariant(wchar_t** src)        : Variant(src)  {}
  1952.  
  1953.     // constructor for array of variants of type varType
  1954.     __fastcall OleVariant(const int* bounds, const int boundsSize, Word varType)  :   Variant(bounds, boundsSize, varType) {}
  1955.  
  1956.     // constructor for one dimensional array of type OleVariant
  1957.     __fastcall OleVariant(const OleVariant* values, const int valuesSize) : Variant(values, valuesSize) {}
  1958.  
  1959.     __fastcall ~OleVariant() {}
  1960.  
  1961.  
  1962.     // Assignment operators
  1963.     //
  1964.     OleVariant& __fastcall operator =(const OleVariant& rhs)
  1965.     {
  1966.       PVariant(this)->operator=(rhs);
  1967.       return *this;
  1968.     }
  1969.     OleVariant& __fastcall operator =(const Variant& rhs)
  1970.     {
  1971.       PVariant(this)->operator=(rhs);
  1972.  
  1973.       // Switch to BSTR if we're an AnsiString Variant
  1974.       //
  1975.       if (Type() == varString)
  1976.         ChangeType(varOleStr);
  1977.  
  1978.       return *this;
  1979.     }
  1980.     OleVariant& __fastcall operator =(VARIANT& rhs)
  1981.     {
  1982.       PVariant(this)->operator=(rhs);
  1983.       return *this;
  1984.     }
  1985.  
  1986.   public:
  1987.  
  1988.     TVarData::VType;
  1989.     TVarData::Reserved1;
  1990.     TVarData::Reserved2;
  1991.     TVarData::Reserved3;
  1992.     TVarData::VSmallint;
  1993.     TVarData::VInteger;
  1994.     TVarData::VSingle;
  1995.     TVarData::VDouble;
  1996.     TVarData::VCurrency;
  1997.     TVarData::VDate;
  1998.     TVarData::VOleStr;
  1999.     TVarData::VDispatch;
  2000.     TVarData::VError;
  2001.     TVarData::VBoolean;
  2002.     TVarData::VUnknown;
  2003.     TVarData::VByte;
  2004.  
  2005.     /*  //!BB Hide this - OleVariant cannot hold ansi string
  2006.     TVarData::VString;
  2007.     */
  2008.     TVarData::VArray;
  2009.     TVarData::VPointer;
  2010.  
  2011.  
  2012.     Variant::operator += ;
  2013.     Variant::operator -= ;
  2014.     Variant::operator *= ;
  2015.     Variant::operator /= ;
  2016.     Variant::operator %= ;
  2017.     Variant::operator &= ;
  2018.     Variant::operator |= ;
  2019.     Variant::operator ^= ;
  2020.     Variant::operator <<=;
  2021.     Variant::operator >>=;
  2022.  
  2023.     // comparisons (Variant on right)
  2024.     Variant::operator == ;
  2025.     Variant::operator != ;
  2026.     Variant::operator <  ;
  2027.     Variant::operator >  ;
  2028.     Variant::operator <= ;
  2029.     Variant::operator >= ;
  2030.  
  2031.     // unary operators
  2032.     Variant::operator -;
  2033.     Variant::operator !;
  2034.  
  2035.     // conversion operators
  2036.     Variant::operator short;
  2037.     Variant::operator int;
  2038.     Variant::operator float;
  2039.     Variant::operator double;
  2040.     Variant::operator Currency;
  2041.     Variant::operator TDateTime;
  2042.     Variant::operator bool;
  2043.     Variant::operator WideString;
  2044.     Variant::operator unsigned short;
  2045.     Variant::operator IDispatch*;
  2046.     Variant::operator IUnknown*;
  2047.     Variant::operator VARIANT;
  2048.  
  2049.  
  2050.     // by ref conversion operators
  2051.     Variant::operator short*;
  2052.     Variant::operator int*;
  2053.     Variant::operator float*;
  2054.     Variant::operator double*;
  2055.     Variant::operator Currency*;
  2056.     Variant::operator TDateTime*;
  2057.     Variant::operator unsigned short*;
  2058.     Variant::operator Byte*;
  2059.     Variant::operator wchar_t**;
  2060.  
  2061.  
  2062.     // HRESULT methods
  2063.     Variant::SetError;
  2064.     Variant::GetError;
  2065.  
  2066.     Variant::Clear;
  2067.     Variant::ChangeType;
  2068.     Variant::AsType;
  2069.  
  2070.     Variant::Type;
  2071.     Variant::IsNull;
  2072.     Variant::IsEmpty;
  2073.  
  2074.     // variant array stuff
  2075.     Variant::IsArray;
  2076.     Variant::GetElement;
  2077.     Variant::PutElement;
  2078.     Variant::ArrayDimCount;
  2079.     Variant::ArrayLowBound;
  2080.     Variant::ArrayHighBound;
  2081.     Variant::ArrayRedim;
  2082.     Variant::ArrayLock;
  2083.     Variant::ArrayUnlock;
  2084.  
  2085.     // Automation Goodies
  2086.     Variant::Exec;
  2087.  
  2088.     // Alternate Syntax for Automation
  2089.     Variant::OleProcedure;
  2090.     Variant::OleFunction;
  2091.     Variant::OlePropertyGet;
  2092.     Variant::OlePropertySet;
  2093.  
  2094.   private:
  2095.  
  2096.     // binary operators (AnsiString on right)
  2097.     OleVariant __fastcall operator * (const AnsiString& rhs) const;
  2098.     OleVariant __fastcall operator / (const AnsiString& rhs) const;
  2099.     OleVariant __fastcall operator % (const AnsiString& rhs) const;
  2100.     OleVariant __fastcall operator & (const AnsiString& rhs) const;
  2101.     OleVariant __fastcall operator | (const AnsiString& rhs) const;
  2102.     OleVariant __fastcall operator ^ (const AnsiString& rhs) const;
  2103.     OleVariant __fastcall operator <<(const AnsiString& rhs) const;
  2104.     OleVariant __fastcall operator >>(const AnsiString& rhs) const;
  2105.   };
  2106.  
  2107. // Variant global scope comparisons (int on left)
  2108.   inline bool __fastcall operator ==(int lhs, const Variant& rhs)
  2109.   {return Variant(lhs).operator ==(rhs);}
  2110.   inline bool __fastcall operator !=(int lhs, const Variant& rhs)
  2111.   {return Variant(lhs).operator !=(rhs);}
  2112.   inline bool __fastcall operator < (int lhs, const Variant& rhs)
  2113.   {return Variant(lhs).operator < (rhs);}
  2114.   inline bool __fastcall operator > (int lhs, const Variant& rhs)
  2115.   {return Variant(lhs).operator > (rhs);}
  2116.   inline bool __fastcall operator <=(int lhs, const Variant& rhs)
  2117.   {return Variant(lhs).operator <=(rhs);}
  2118.   inline bool __fastcall operator >=(int lhs, const Variant& rhs)
  2119.   {return Variant(lhs).operator >=(rhs);}
  2120.  
  2121. // Variant global scope comparisons (double on left)
  2122.   inline bool __fastcall operator ==(double lhs, const Variant& rhs)
  2123.   {return Variant(lhs).operator ==(rhs);}
  2124.   inline bool __fastcall operator !=(double lhs, const Variant& rhs)
  2125.   {return Variant(lhs).operator !=(rhs);}
  2126.   inline bool __fastcall operator < (double lhs, const Variant& rhs)
  2127.   {return Variant(lhs).operator < (rhs);}
  2128.   inline bool __fastcall operator > (double lhs, const Variant& rhs)
  2129.   {return Variant(lhs).operator > (rhs);}
  2130.   inline bool __fastcall operator <=(double lhs, const Variant& rhs)
  2131.   {return Variant(lhs).operator <=(rhs);}
  2132.   inline bool __fastcall operator >=(double lhs, const Variant& rhs)
  2133.   {return Variant(lhs).operator >=(rhs);}
  2134.  
  2135. // Variant binary global scope operators (AnsiString on left)
  2136.   inline Variant __fastcall operator - (const AnsiString& lhs, const Variant& rhs)
  2137.   {return Variant(lhs).operator -(rhs);}
  2138.   inline Variant __fastcall operator * (const AnsiString& lhs, const Variant& rhs)
  2139.   {return Variant(lhs).operator *(rhs);}
  2140.   inline Variant __fastcall operator / (const AnsiString& lhs, const Variant& rhs)
  2141.   {return Variant(lhs).operator /(rhs);}
  2142.   inline Variant __fastcall operator % (const AnsiString& lhs, const Variant& rhs)
  2143.   {return Variant(lhs).operator %(rhs);}
  2144.   inline Variant __fastcall operator & (const AnsiString& lhs, const Variant& rhs)
  2145.   {return Variant(lhs).operator &(rhs);}
  2146.   inline Variant __fastcall operator | (const AnsiString& lhs, const Variant& rhs)
  2147.   {return Variant(lhs).operator |(rhs);}
  2148.   inline Variant __fastcall operator ^ (const AnsiString& lhs, const Variant& rhs)
  2149.   {return Variant(lhs).operator ^(rhs);}
  2150.   inline Variant __fastcall operator <<(const AnsiString& lhs, const Variant& rhs)
  2151.   {return Variant(lhs).operator <<(rhs);}
  2152.   inline Variant __fastcall operator >>(const AnsiString& lhs, const Variant& rhs)
  2153.   {return Variant(lhs).operator >>(rhs);}
  2154.  
  2155. // Variant binary global scope operators (int on left)
  2156.   inline Variant __fastcall operator +(int lhs, const Variant& rhs)
  2157.   {return Variant(lhs).operator +(rhs);}
  2158.   inline Variant __fastcall operator -(int lhs, const Variant& rhs)
  2159.   {return Variant(lhs).operator -(rhs);}
  2160.   inline Variant __fastcall operator *(int lhs, const Variant& rhs)
  2161.   {return Variant(lhs).operator *(rhs);}
  2162.   inline Variant __fastcall operator /(int lhs, const Variant& rhs)
  2163.   {return Variant(lhs).operator /(rhs);}
  2164.   inline Variant __fastcall operator %(int lhs, const Variant& rhs)
  2165.   {return Variant(lhs).operator %(rhs);}
  2166.   inline Variant __fastcall operator &(int lhs, const Variant& rhs)
  2167.   {return Variant(lhs).operator &(rhs);}
  2168.   inline Variant __fastcall operator |(int lhs, const Variant& rhs)
  2169.   {return Variant(lhs).operator |(rhs);}
  2170.   inline Variant __fastcall operator ^(int lhs, const Variant& rhs)
  2171.   {return Variant(lhs).operator ^(rhs);}
  2172.   inline Variant __fastcall operator <<(int lhs, const Variant& rhs)
  2173.   {return Variant(lhs).operator <<(rhs);}
  2174.   inline Variant __fastcall operator >>(int lhs, const Variant& rhs)
  2175.   {return Variant(lhs).operator >>(rhs);}
  2176.  
  2177. // Variant binary global scope operators (double on left)
  2178.   inline Variant __fastcall operator +(double lhs, const Variant& rhs)
  2179.   {return Variant(lhs).operator +(rhs);}
  2180.   inline Variant __fastcall operator -(double lhs, const Variant& rhs)
  2181.   {return Variant(lhs).operator -(rhs);}
  2182.   inline Variant __fastcall operator *(double lhs, const Variant& rhs)
  2183.   {return Variant(lhs).operator *(rhs);}
  2184.   inline Variant __fastcall operator /(double lhs, const Variant& rhs)
  2185.   {return Variant(lhs).operator /(rhs);}
  2186.   inline Variant __fastcall operator %(double lhs, const Variant& rhs)
  2187.   {return Variant(lhs).operator %(rhs);}
  2188.   inline Variant __fastcall operator &(double lhs, const Variant& rhs)
  2189.   {return Variant(lhs).operator &(rhs);}
  2190.   inline Variant __fastcall operator |(double lhs, const Variant& rhs)
  2191.   {return Variant(lhs).operator |(rhs);}
  2192.   inline Variant __fastcall operator ^(double lhs, const Variant& rhs)
  2193.   {return Variant(lhs).operator ^(rhs);}
  2194.   inline Variant __fastcall operator <<(double lhs, const Variant& rhs)
  2195.   {return Variant(lhs).operator <<(rhs);}
  2196.   inline Variant __fastcall operator >>(double lhs, const Variant& rhs)
  2197.   {return Variant(lhs).operator >>(rhs);}
  2198.  
  2199. // NOTE: Defined in Delphi - Keep in sync.
  2200. //
  2201. #define MaxDispArgs (Byte)(32)
  2202.  
  2203.   class PACKAGE NamedParm;
  2204.   class PACKAGE AutoCmd
  2205.   {
  2206.   public:
  2207.     AutoCmd(const String& name);
  2208.     AutoCmd(const AutoCmd& src);
  2209.    ~AutoCmd();
  2210.  
  2211.     // Set(update) name of command
  2212.     virtual AutoCmd& SetName(const String& name);
  2213.  
  2214.     // Named arg
  2215.     virtual AutoCmd& operator <<(const NamedParm& np);
  2216.  
  2217.     // By value args
  2218.     virtual AutoCmd& operator <<(const Variant& arg);
  2219.     virtual AutoCmd& operator <<(const short arg);
  2220.     virtual AutoCmd& operator <<(const int arg);
  2221.     virtual AutoCmd& operator <<(const float arg);
  2222.     virtual AutoCmd& operator <<(const double arg);
  2223.     virtual AutoCmd& operator <<(const Currency arg);
  2224.     virtual AutoCmd& operator <<(const TDateTime arg);
  2225.     virtual AutoCmd& operator <<(const bool arg);
  2226.     virtual AutoCmd& operator <<(const WordBool arg);
  2227.     virtual AutoCmd& operator <<(const Byte arg);
  2228.     virtual AutoCmd& operator <<(const AnsiString& arg);
  2229.     virtual AutoCmd& operator <<(const char* arg) // treat as asciiz pointer
  2230.     {return operator <<(AnsiString(arg));}
  2231. #if 0
  2232.     //!JK not allowed    virtual AutoCmd& operator <<(wchar_t* const arg);
  2233. #endif
  2234.     virtual AutoCmd& operator <<(IDispatch* const arg);
  2235.     virtual AutoCmd& operator <<(IUnknown* const arg);
  2236.     //By ref args
  2237.     virtual AutoCmd& operator <<(Variant* arg);
  2238.     virtual AutoCmd& operator <<(short* arg);
  2239.     virtual AutoCmd& operator <<(int* arg);
  2240.     virtual AutoCmd& operator <<(float* arg);
  2241.     virtual AutoCmd& operator <<(double* arg);
  2242.     virtual AutoCmd& operator <<(Currency* arg);
  2243.     virtual AutoCmd& operator <<(TDateTime* arg);
  2244.     virtual AutoCmd& operator <<(WordBool* arg);
  2245.     virtual AutoCmd& operator <<(Byte* arg);
  2246. #if 0
  2247.     //!JK not allowed    virtual AutoCmd& operator <<(wchar_t** arg);
  2248. #endif
  2249.     virtual AutoCmd& operator <<(AnsiString* arg);
  2250.  
  2251.     virtual AutoCmd& Clear();                 // ClearName() + ClearArgs()
  2252.     virtual AutoCmd& ClearName();             // SetName("")
  2253.     virtual AutoCmd& ClearArgs();             // Clear Parms and NamedParms
  2254.  
  2255.     virtual Byte GetCallType() const = 0;
  2256.     virtual bool RequestResult() const = 0;
  2257.     virtual int GetArgType(const Byte idx) const;
  2258.     virtual int GetNamedArgType(const Byte idx) const;
  2259.     virtual String GetName() const { return Name;}
  2260.     virtual Byte GetArgCount() const;
  2261.     virtual Byte GetNamedArgCount() const;
  2262.     virtual Variant& GetParm(const Byte idx);
  2263.     virtual Variant& GetNamedParm(const Byte idx);
  2264.     virtual String GetNamedParmName(const Byte idx) const;
  2265.     virtual String GetStringArg(const Byte idx) {return StringArgs[idx];}
  2266.     virtual String* GetStringPtr(const Byte idx) {return StringPtrs[idx];}
  2267.     virtual String GetNamedStringArg(const Byte idx) {return NamedStringArgs[idx];}
  2268.     virtual String* GetNamedStringPtr(const Byte idx) {return NamedStringPtrs[idx];}
  2269.  
  2270.   protected:
  2271.     void              AddElement();
  2272.     String            Name;                             // name of command
  2273.     Variant           Parms;                            // positional arguments
  2274.     Variant           ParmTypes;                        // types of positional arguments
  2275.     Variant           NamedParms;                       // named arguments
  2276.     Variant           NamedParmTypes;                   // types of named arguments
  2277.     Variant           NamedParmNames;                   // names of named arguments
  2278.     AnsiString        StringArgs[MaxDispArgs];          //
  2279.     AnsiString*       StringPtrs[MaxDispArgs];          //
  2280.     AnsiString        NamedStringArgs[MaxDispArgs];     //
  2281.     AnsiString*       NamedStringPtrs[MaxDispArgs];     //
  2282.   };
  2283.  
  2284.   class PACKAGE NamedParm
  2285.   {
  2286.   public:
  2287.     //By value ctors
  2288.     NamedParm(const String& name, const Variant& arg):
  2289.     Name(name), Type(varVariant), Parm(arg) {}
  2290.     NamedParm(const String& name, const short arg):
  2291.     Name(name), Type(varSmallint), Parm(arg) {}
  2292.     NamedParm(const String& name, const int arg):
  2293.     Name(name), Type(varInteger), Parm(arg) {}
  2294.     NamedParm(const String& name, const float arg):
  2295.     Name(name), Type(varSingle), Parm(arg) {}
  2296.     NamedParm(const String& name, const double arg):
  2297.     Name(name), Type(varDouble), Parm(arg) {}
  2298.     NamedParm(const String& name, const Currency arg):
  2299.     Name(name), Type(varCurrency), Parm(arg) {}
  2300.     NamedParm(const String& name, const TDateTime arg):
  2301.     Name(name), Type(varDate), Parm(arg) {}
  2302.     NamedParm(const String& name, const bool arg):
  2303.     Name(name), Type(varBoolean), Parm(arg) {}
  2304.     NamedParm(const String& name, const WordBool arg):
  2305.     Name(name), Type(varBoolean), Parm(arg) {}
  2306.     NamedParm(const String& name, const Byte arg):
  2307.     Name(name), Type(varByte), Parm(arg) {}
  2308.     NamedParm(const String& name, const AnsiString& arg):
  2309.     Name(name), Type(varString), StringParm(arg) {}
  2310.     NamedParm(const String& name, const char* arg): // treat as asciiz pointer
  2311.     Name(name), Type(varString), StringParm(arg) {}
  2312. #if 0
  2313.     //!JK not allowed NamedParm(const String& name, wchar_t* const arg):
  2314.     //!JK not allowed   Name(name), Type(varOleStr), Parm(arg) {}
  2315. #endif
  2316.     NamedParm(const String& name, IDispatch* const arg):
  2317.     Name(name), Type(varDispatch), Parm(arg) {}
  2318.     NamedParm(const String& name, IUnknown* const arg):
  2319.     Name(name), Type(varUnknown), Parm(arg) {}
  2320.     //By ref ctors
  2321.     NamedParm(const String& name, Variant* arg);
  2322.     NamedParm(const String& name, short* arg):
  2323.     Name(name), Type(varSmallint | varByRef), Parm(arg) {}
  2324.     NamedParm(const String& name, int* arg):
  2325.     Name(name), Type(varInteger | varByRef), Parm(arg) {}
  2326.     NamedParm(const String& name, float* arg):
  2327.     Name(name), Type(varSingle | varByRef), Parm(arg) {}
  2328.     NamedParm(const String& name, double* arg):
  2329.     Name(name), Type(varDouble | varByRef), Parm(arg) {}
  2330.     NamedParm(const String& name, Currency* arg):
  2331.     Name(name), Type(varCurrency | varByRef), Parm(arg) {}
  2332.     NamedParm(const String& name, TDateTime* arg):
  2333.     Name(name), Type(varDate | varByRef), Parm(arg) {}
  2334.     NamedParm(const String& name, WordBool* arg):
  2335.     Name(name), Type(varBoolean | varByRef), Parm(arg) {}
  2336.     NamedParm(const String& name, Byte* arg):
  2337.     Name(name), Type(varByte | varByRef), Parm(arg) {}
  2338. #if 0
  2339.     //!JK not allowed NamedParm(const String& name, wchar_t** arg):
  2340.     //!JK not allowed   Name(name), Type(varOleStr | varByRef), Parm(arg) {}
  2341. #endif
  2342.     NamedParm(const String& name, String* arg):
  2343.     Name(name), Type(varString | varByRef), StringPtr(arg) {}
  2344.  
  2345.     virtual Variant GetParm() const { return Parm;}
  2346.     virtual AnsiString GetStringParm() const { return StringParm;}
  2347.     virtual AnsiString* GetStringPtr() const { return StringPtr;}
  2348.     virtual int GetType() const { return Type;}
  2349.     virtual String GetParmName() const { return Name;}
  2350.   protected:
  2351.     void AddElement();
  2352.     String                  Name;
  2353.     Variant                 Parm;
  2354.     AnsiString              StringParm;
  2355.     AnsiString*             StringPtr;
  2356.     int                     Type;
  2357.   };
  2358.  
  2359.   class PACKAGE Procedure : public AutoCmd
  2360.   {
  2361.   public:
  2362.     Procedure(const String& name): AutoCmd(name) {}
  2363.     Procedure(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const Procedure*>(&src);}
  2364.     virtual Byte GetCallType() const;
  2365.     virtual bool RequestResult() const { return false;}
  2366.   };
  2367.  
  2368.   class PACKAGE Function : public AutoCmd
  2369.   {
  2370.   public:
  2371.     Function(const String& name): AutoCmd(name) {}
  2372.     Function(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const Function*>(&src);}
  2373.     virtual Byte GetCallType() const;
  2374.     virtual bool RequestResult() const { return true;}
  2375.   };
  2376.  
  2377.   class PACKAGE PropertySet : public AutoCmd
  2378.   {
  2379.   public:
  2380.     PropertySet(const String& name): AutoCmd(name) {}
  2381.     PropertySet(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const PropertySet*>(&src);}
  2382.     virtual Byte GetCallType() const;
  2383.     virtual bool RequestResult() const { return false;}
  2384.   };
  2385.  
  2386.   class PACKAGE PropertyGet : public AutoCmd
  2387.   {
  2388.   public:
  2389.     PropertyGet(const String& name): AutoCmd(name) {}
  2390.     PropertyGet(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const PropertyGet*>(&src);}
  2391.     virtual Byte GetCallType() const;
  2392.     virtual bool RequestResult() const { return true;}
  2393.   };
  2394.  
  2395.   typedef class TMemoryManager *PMemoryManager;
  2396.  
  2397.   class PACKAGE TMemoryManager
  2398.   {
  2399.   public:
  2400.     Pointer __fastcall (*GetMem)(Integer Size);
  2401.     Integer __fastcall (*FreeMem)(Pointer P);
  2402.     Pointer __fastcall (*ReallocMem)(Pointer P, Integer Size);
  2403.   } ;
  2404.  
  2405.   class PACKAGE THeapStatus
  2406.   {
  2407.   public:
  2408.     Cardinal TotalAddrSpace;
  2409.     Cardinal TotalUncommitted;
  2410.     Cardinal TotalCommitted;
  2411.     Cardinal TotalAllocated;
  2412.     Cardinal TotalFree;
  2413.     Cardinal FreeSmall;
  2414.     Cardinal FreeBig;
  2415.     Cardinal Unused;
  2416.     Cardinal Overhead;
  2417.     Cardinal HeapErrorCode;
  2418.   } ;
  2419.  
  2420.   typedef Integer __fastcall (*TThreadFunc)(Pointer Parameter);
  2421.  
  2422. #ifdef BCBVER1
  2423.   #define USEDATAMODULE(FileName, DataModuleName)  \
  2424.     class DELPHICLASS T##DataModuleName;       \
  2425.     extern T##DataModuleName *DataModuleName;
  2426. #else
  2427.   #define USEDATAMODULE(FileName, DataModuleName)  \
  2428.     class DELPHICLASS T##DataModuleName;       \
  2429.     extern PACKAGE T##DataModuleName *DataModuleName;
  2430. #endif
  2431.  
  2432. #ifdef BCBVER1
  2433.   #define USEDATAMODULENS(FileName, UnitName, DataModuleName)  \
  2434.     namespace UnitName {         \
  2435.     class DELPHICLASS T##DataModuleName;       \
  2436.     extern T##DataModuleName *DataModuleName;              \
  2437.    };               \
  2438.    using namespace UnitName
  2439. #else
  2440.   #define USEDATAMODULENS(FileName, UnitName, DataModuleName)  \
  2441.     namespace UnitName {         \
  2442.     class DELPHICLASS T##DataModuleName;       \
  2443.     extern PACKAGE T##DataModuleName *DataModuleName;              \
  2444.     };               \
  2445.     using namespace UnitName
  2446. #endif
  2447.  
  2448. #ifdef BCBVER1
  2449.   #define USEFORM(FileName, FormName) \
  2450.     class DELPHICLASS T##FormName;       \
  2451.     extern T##FormName *FormName;
  2452. #else
  2453.   #define USEFORM(FileName, FormName) \
  2454.     class DELPHICLASS T##FormName;       \
  2455.     extern PACKAGE T##FormName *FormName;
  2456. #endif
  2457.  
  2458. #ifdef BCBVER1
  2459.   #define USEFORMNS(FileName, UnitName, FormName) \
  2460.     namespace UnitName {         \
  2461.     class DELPHICLASS T##FormName;       \
  2462.     extern T##FormName *FormName;          \
  2463.     };               \
  2464.     using namespace UnitName
  2465. #else
  2466.   #define USEFORMNS(FileName, UnitName, FormName) \
  2467.     namespace UnitName {         \
  2468.     class DELPHICLASS T##FormName;       \
  2469.     extern PACKAGE T##FormName *FormName;          \
  2470.     };               \
  2471.     using namespace UnitName
  2472. #endif
  2473.  
  2474. #define USEUNIT(ModName) \
  2475.    extern PACKAGE DummyThatIsNeverReferenced
  2476.  
  2477. #define USEOBJ(FileName) \
  2478.    extern PACKAGE DummyThatIsNeverReferenced
  2479.  
  2480. #define USERC(FileName) \
  2481.    extern PACKAGE DummyThatIsNeverReferenced
  2482.  
  2483. #define USEASM(FileName) \
  2484.    extern PACKAGE DummyThatIsNeverReferenced
  2485.  
  2486. #define USEDEF(FileName) \
  2487.    extern PACKAGE DummyThatIsNeverReferenced
  2488.  
  2489. #define USERES(FileName) \
  2490.    extern PACKAGE DummyThatIsNeverReferenced
  2491.  
  2492. #define USETLB(FileName) \
  2493.    extern PACKAGE DummyThatIsNeverReferenced
  2494.  
  2495. #define USELIB(FileName) \
  2496.    extern PACKAGE DummyThatIsNeverReferenced
  2497.  
  2498. #define USEFILE(FileName) \
  2499.    extern PACKAGE DummyThatIsNeverReferenced
  2500.  
  2501. #define USEPACKAGE(FileName) \
  2502.    extern PACKAGE DummyThatIsNeverReferenced
  2503.  
  2504.   struct PACKAGE ResourceString
  2505.   {
  2506.     HINSTANCE       *hinstance;
  2507.     unsigned long   id;                     // resource string id
  2508.   };
  2509.  
  2510.   extern PACKAGE AnsiString __fastcall LoadResourceString(ResourceString const * const rsrc);
  2511.  
  2512.   typedef void (*TModuleUnloadProc)(HINSTANCE hinstance);
  2513.   typedef bool (*TEnumModuleFunc)(HINSTANCE hinstance, void *data);
  2514.  
  2515.   struct PACKAGE TModuleUnloadRec
  2516.   {
  2517.     TModuleUnloadRec    *next;
  2518.     TModuleUnloadProc   *proc;
  2519.   };
  2520.   typedef TModuleUnloadRec *PModuleUnloadRec;
  2521.  
  2522.   struct PACKAGE TLibModule
  2523.   {
  2524.     TLibModule  *next;
  2525.     long        instance;
  2526.     long        resinstance;
  2527.     long        reserved;
  2528.   };
  2529.   typedef TLibModule *PLibModule;
  2530.  
  2531.   struct PACKAGE TResStringRec
  2532.   {
  2533.     long        module;
  2534.     long        ident;
  2535.   };
  2536.  
  2537.   typedef TResStringRec *PResStringRec;
  2538.  
  2539.   extern PACKAGE void __fastcall  VarClear(Variant& v); /* variant.cpp */
  2540.   extern PACKAGE void __fastcall  VarCast(Variant &dest, const Variant& source, int type); /* variant.cpp */
  2541.   extern PACKAGE void __fastcall  VarArrayRedim(Variant& a, int high); /* variant.cpp */
  2542.  
  2543.   /* DelphInterface
  2544.     This template class is to be used for allowing Delphi-owned interfaces to be returned
  2545.     from Pascal function to C++ functions.  Since Delphi automatically provides reference
  2546.     counting for these references (removing a huge burden from the programmer), the
  2547.     class implemented strives to maintain this features for the C++ programmer.
  2548.  
  2549.     The following invariants must hold:
  2550.       sizeof(DelphiInterface<T>) == 4
  2551.       template DelphiInterface<T> must be marked DELPHIRETURN
  2552.       BCC32 for BCB 3.0 or later must be used to compile this template
  2553.       reference counting must be provided by the ctor, copy ctor, operator= and dtor.
  2554.       the template type T must be derived from a class which has an AddRef and Release.
  2555.  
  2556.     The following general rules apply:
  2557.       - the T* and T** operators do not perform reference counting; it is the
  2558.         responsibility of the programmer to ensure that refernce handling is
  2559.         correctly performed when these two conversion operators are used.
  2560.       - taking the address of the interface stored in a DelphiInterface<T> does NOT:
  2561.         - release the previous interface
  2562.         - increment the reference count of the current interface
  2563.           - it is the responsibility of the programmer to ensure that
  2564.           reference counting is handled properly when the T** operator is used.
  2565.       - if no interface is stored in a DelphiInterface<T>, the T* operator will return 0.
  2566.   */
  2567.   template <class T> class DELPHIRETURN DelphiInterface
  2568.   {
  2569.   private:
  2570.     T       *intf;
  2571.  
  2572.   public:
  2573.     __fastcall DelphiInterface<T>() : intf(0)
  2574.     {}
  2575.  
  2576.     __fastcall DelphiInterface<T>(const DelphiInterface<T> &rhs)
  2577.     {
  2578.       if (rhs.intf != 0)
  2579.         rhs.intf->AddRef();
  2580.       intf = rhs.intf;
  2581.     }
  2582.  
  2583.     __fastcall DelphiInterface<T>(T* rhs)
  2584.     {
  2585.       if (rhs != 0)
  2586.         rhs->AddRef();
  2587.       intf = rhs;
  2588.     }
  2589.  
  2590.     __fastcall ~DelphiInterface<T>()
  2591.     {
  2592.       if (intf != 0)
  2593.         intf->Release();
  2594.       intf = 0;
  2595.     }
  2596.  
  2597.     __fastcall DelphiInterface<T>& operator =(DelphiInterface<T> &rhs)
  2598.     {
  2599.       if (rhs.intf != 0)
  2600.         rhs.intf->AddRef();
  2601.  
  2602.       if (intf != 0)
  2603.         intf->Release();
  2604.  
  2605.       intf = rhs.intf;
  2606.       return *this;
  2607.     }
  2608.  
  2609.     __fastcall DelphiInterface<T>& operator =(T *rhs)
  2610.     {
  2611.       if (rhs != 0)
  2612.         rhs->AddRef();
  2613.  
  2614.       if (intf != 0)
  2615.         intf->Release();
  2616.  
  2617.       intf = rhs;
  2618.       return *this;
  2619.     }
  2620.  
  2621.     T* __fastcall operator->() const
  2622.     {
  2623.       return intf;
  2624.     }
  2625.  
  2626.     bool operator ! () const
  2627.     {
  2628.       return (intf == 0);
  2629.     };
  2630.  
  2631.     __fastcall operator T*() const
  2632.     {
  2633.       return intf;
  2634.     }
  2635.  
  2636.     T& __fastcall operator *()
  2637.     {
  2638.       return *intf;
  2639.     }
  2640.  
  2641.     void Release()
  2642.     {
  2643.       if (intf)
  2644.         intf->Release();
  2645.       intf = 0;
  2646.     }
  2647.  
  2648.     T** __fastcall operator &()
  2649.     {
  2650.       return &intf;
  2651.     }
  2652.   };
  2653.  
  2654.   extern PACKAGE void __fastcall CheckSafecallResult(HRESULT hr);
  2655. } // namespace System
  2656. using namespace System;
  2657.  
  2658. // Type definition of interfaces wrapped by a smart object
  2659. //
  2660. #if !defined(DECLARE_DINTERFACE_TYPE)
  2661. #define DECLARE_DINTERFACE_TYPE(iface) \
  2662.         interface iface;               \
  2663.         typedef System::DelphiInterface< iface >  _di_ ## iface;
  2664. #endif  // DECLARE_DINTERFACE_TYPE
  2665.  
  2666. DECLARE_DINTERFACE_TYPE(IUnknown)
  2667. DECLARE_DINTERFACE_TYPE(IDispatch)
  2668. DECLARE_DINTERFACE_TYPE(IAdviseSink)
  2669. DECLARE_DINTERFACE_TYPE(IDataObject)
  2670. DECLARE_DINTERFACE_TYPE(IEnumOLEVERB)
  2671. DECLARE_DINTERFACE_TYPE(IEnumSTATDATA)
  2672. DECLARE_DINTERFACE_TYPE(ILockBytes)
  2673. DECLARE_DINTERFACE_TYPE(IMalloc)
  2674. DECLARE_DINTERFACE_TYPE(IMoniker)
  2675. DECLARE_DINTERFACE_TYPE(IOleAdviseHolder)
  2676. DECLARE_DINTERFACE_TYPE(IOleClientSite)
  2677. DECLARE_DINTERFACE_TYPE(IOleContainer)
  2678. DECLARE_DINTERFACE_TYPE(IOleInPlaceActiveObject)
  2679. DECLARE_DINTERFACE_TYPE(IOleInPlaceFrame)
  2680. DECLARE_DINTERFACE_TYPE(IOleInPlaceObject)
  2681. DECLARE_DINTERFACE_TYPE(IOleInPlaceSite)
  2682. DECLARE_DINTERFACE_TYPE(IOleInPlaceUIWindow)
  2683. DECLARE_DINTERFACE_TYPE(IOleObject)
  2684. DECLARE_DINTERFACE_TYPE(IStorage)
  2685. DECLARE_DINTERFACE_TYPE(IStream)
  2686. DECLARE_DINTERFACE_TYPE(ITypeInfo)
  2687. DECLARE_DINTERFACE_TYPE(ITypeLib)
  2688. DECLARE_DINTERFACE_TYPE(IConnectionPointContainer)
  2689. DECLARE_DINTERFACE_TYPE(IConnectionPoint)
  2690. DECLARE_DINTERFACE_TYPE(IEnumConnectionPoints)
  2691. DECLARE_DINTERFACE_TYPE(ISimpleFrameSite)
  2692. DECLARE_DINTERFACE_TYPE(IPropertyBag)
  2693. DECLARE_DINTERFACE_TYPE(IEnumConnections)
  2694. DECLARE_DINTERFACE_TYPE(IOleControl)
  2695. DECLARE_DINTERFACE_TYPE(IOleControlSite)
  2696. DECLARE_DINTERFACE_TYPE(IPerPropertyBrowsing)
  2697. DECLARE_DINTERFACE_TYPE(IFontDisp)
  2698. DECLARE_DINTERFACE_TYPE(IPersistStreamInit)
  2699. DECLARE_DINTERFACE_TYPE(IPicture)
  2700. DECLARE_DINTERFACE_TYPE(IPictureDisp)
  2701. DECLARE_DINTERFACE_TYPE(IPropertyPageSite)
  2702. DECLARE_DINTERFACE_TYPE(IOleClientSite)
  2703. DECLARE_DINTERFACE_TYPE(IErrorLog)
  2704. DECLARE_DINTERFACE_TYPE(IEnumOLEVERB)
  2705. DECLARE_DINTERFACE_TYPE(IOleDocumentView)
  2706. DECLARE_DINTERFACE_TYPE(IOleAdviseHolder)
  2707. DECLARE_DINTERFACE_TYPE(IOleContainer)
  2708. DECLARE_DINTERFACE_TYPE(IOleInPlaceActiveObject)
  2709. DECLARE_DINTERFACE_TYPE(IOleInPlaceObject)
  2710. DECLARE_DINTERFACE_TYPE(IOleInPlaceUIWindow)
  2711. DECLARE_DINTERFACE_TYPE(IOleInPlaceFrame)
  2712. DECLARE_DINTERFACE_TYPE(IOleObject)
  2713. DECLARE_DINTERFACE_TYPE(IOleInPlaceSite)
  2714.  
  2715. namespace Typinfo
  2716. {
  2717.   struct  TTypeInfo;
  2718.   typedef TTypeInfo *PTypeInfo;
  2719. }
  2720.  
  2721. namespace Controls
  2722. {
  2723.   typedef System::TDateTime TDate;
  2724.   typedef System::TDateTime TTime;
  2725. }
  2726.  
  2727.  
  2728. // Define VCL_IOSTREAM operators
  2729. //
  2730. #if defined(VCL_IOSTREAM)
  2731.  
  2732. namespace System
  2733. {
  2734.   inline void read_to_delim(istream& strm, char delim, AnsiString& str)
  2735.   {
  2736.     char ch;
  2737.     int nchars = 0;
  2738.     char array[4096];
  2739.     int capacity = sizeof array;
  2740.  
  2741.     while ( 1 )
  2742.     {
  2743.  
  2744.       // Read as many characters as we can, up to the delimiter:
  2745.       strm.get( array+nchars, capacity-nchars+1, delim );
  2746.  
  2747.       // This is the new string length:
  2748.       nchars += strlen( array+nchars );
  2749.  
  2750.       // What stopped us?  An EOF?
  2751.       if ( !strm.good() )
  2752.         break;      // EOF encountered (or worse!)
  2753.  
  2754.       // Nope.  Was it the delimiter?
  2755.       strm.get(ch);
  2756.       if (ch==delim)
  2757.         break;  // Yup. We're done.  Don't put it back on the stream.
  2758.       else
  2759.         strm.putback(ch); // Nope, Put it back and keep going.
  2760.  
  2761.     }
  2762.     str = array;
  2763.   }
  2764.  
  2765.   inline istream& operator >> (istream& is, AnsiString& arg)
  2766.   {
  2767.     read_to_delim(is, 0, arg);
  2768.     return is;
  2769.   }
  2770.  
  2771.   inline ostream& operator << (ostream& os, const AnsiString& arg)
  2772.   {
  2773.     return os << arg.c_str();
  2774.   }
  2775.  
  2776.   template <unsigned char sz>
  2777.   inline ostream& operator << (ostream& os, const SmallString<sz>& arg)
  2778.   {
  2779.     os << AnsiString(arg).c_str();
  2780.     return os;
  2781.   }
  2782.  
  2783.   template <unsigned char sz>
  2784.   inline istream& operator >> (istream& is, SmallString<sz>& arg)
  2785.   {
  2786.     AnsiString s;
  2787.     is >> s;
  2788.     arg = s;
  2789.     return is;
  2790.   }
  2791.  
  2792.  
  2793.   // Currency IOStream operators
  2794.   //
  2795.   inline ostream& operator << (ostream& os, const Currency& arg)
  2796.   {
  2797.     os << AnsiString(arg);
  2798.     return os;
  2799.   }
  2800.  
  2801.   inline istream& operator >> (istream& is, Currency& arg)
  2802.   {
  2803.     AnsiString s;
  2804.     is >> s;
  2805.     arg = s;
  2806.     return is;
  2807.   }
  2808.  
  2809.  
  2810.   // TDateTime IOStream operators
  2811.   //
  2812.   inline ostream& operator << (ostream& os, const TDateTime& arg)
  2813.   {
  2814.     os << AnsiString(arg);
  2815.     return os;
  2816.   }
  2817.  
  2818.   inline istream& operator >> (istream& is, TDateTime& arg)
  2819.   {
  2820.     AnsiString s;
  2821.     is >> s;
  2822.     arg = s;
  2823.     return is;
  2824.   }
  2825.  
  2826.  
  2827.   // Variant IOStream operators
  2828.   //
  2829.   inline ostream& operator <<(ostream& os, const Variant& arg)
  2830.   {
  2831.     switch (arg.VType)
  2832.     {
  2833.     case varEmpty:
  2834.       os << "varEmpty";
  2835.       break;
  2836.     case varNull:
  2837.       os << "varNull";
  2838.       break;
  2839.     case varSmallint:
  2840.       os << "varSmallint: " << arg.VSmallint;
  2841.       break;
  2842.     case varInteger:
  2843.       os << "varInteger: " << arg.VInteger;
  2844.       break;
  2845.     case varSingle:
  2846.       os << "varSingle: " << arg.VSingle;
  2847.       break;
  2848.     case varDouble:
  2849.       os << "varDouble: " << arg.VDouble;
  2850.       break;
  2851.     case varCurrency:
  2852.       os << "varCurrency: " << arg.VCurrency;
  2853.       break;
  2854.     case varDate:
  2855.       os << "varDate: " << arg.VDate;
  2856.       break;
  2857.     case varOleStr:
  2858.       os << "varOleStr: " << AnsiString(arg.VOleStr);
  2859.       break;
  2860.     case varDispatch:
  2861.       os << "varDispatch: " << static_cast<void*>(arg.VDispatch);
  2862.       break;
  2863.     case varError:
  2864.       os << "varError: " << arg.VError;
  2865.       break;
  2866.     case varBoolean:
  2867.       os << "varBoolean: " << arg.operator bool();
  2868.       break;
  2869.     case varUnknown:
  2870.       os << "varUnknown: " << static_cast<void*>(arg.VUnknown);
  2871.       break;
  2872.     case varByte:
  2873.       os << "varByte: " << arg.VByte;
  2874.       break;
  2875.     case varString:
  2876.       os << "varString: " << arg.operator AnsiString();
  2877.       break;
  2878.     case varArray:
  2879.       os << "varArray: " << static_cast<void*>(arg.VArray);
  2880.       break;
  2881.     case varSmallint | varByRef:
  2882.       os << "varSmallint | varByRef: " << arg.VPointer;
  2883.       break;
  2884.     case varInteger | varByRef:
  2885.       os << "varInteger | varByRef: " << arg.VPointer;
  2886.       break;
  2887.     case varSingle | varByRef:
  2888.       os << "varSingle | varByRef: " << arg.VPointer;
  2889.       break;
  2890.     case varDouble | varByRef:
  2891.       os << "varDouble | varByRef: " << arg.VPointer;
  2892.       break;
  2893.     case varCurrency | varByRef:
  2894.       os << "varCurrency | varByRef: " << arg.VPointer;
  2895.       break;
  2896.     case varDate | varByRef:
  2897.       os << "varDate | varByRef: " << arg.VPointer;
  2898.       break;
  2899.     case varOleStr | varByRef:
  2900.       os << "varOleStr | varByRef: " << arg.VPointer;
  2901.       break;
  2902.     case varDispatch | varByRef:
  2903.       os << "varDispatch | varByRef: " << arg.VPointer;
  2904.       break;
  2905.     case varError | varByRef:
  2906.       os << "varError | varByRef: " << arg.VPointer;
  2907.       break;
  2908.     case varBoolean | varByRef:
  2909.       os << "varBoolean | varByRef: " << arg.VPointer;
  2910.       break;
  2911.     case varUnknown | varByRef:
  2912.       os << "varUnknown | varByRef: " << arg.VPointer;
  2913.       break;
  2914.     case varByte | varByRef:
  2915.       os << "varByte | varByRef: " << arg.VPointer;
  2916.       break;
  2917.     case varString | varByRef:
  2918.       os << "varString | varByRef: " << arg.VPointer;
  2919.       break;
  2920.     case varArray | varByRef:
  2921.       os << "varArray | varByRef: " << arg.VPointer;
  2922.       break;
  2923.     }
  2924.     return os;
  2925.   }
  2926. }       // namespace System
  2927. #endif  // VCL_IOSTREAM
  2928.  
  2929.  
  2930. #if !defined(__typeinfo)
  2931. #define __typeinfo(type)  (PTypeInfo)TObject::ClassInfo(__classid(type))
  2932. #endif
  2933.  
  2934. #pragma option pop
  2935.  
  2936. // Undo the MACROs which mapped the Automation related types to their tagStruct.
  2937. //
  2938. #if defined(CURRENCY)
  2939. #undef CURRENCY
  2940. #endif
  2941. #if defined(SAFEARRAY)
  2942. #undef SAFEARRAY
  2943. #endif
  2944. #if defined(VARIANT)
  2945. #undef  VARIANT
  2946. #endif
  2947.  
  2948. #endif  //  SYSDEFS_H
  2949.  
  2950.